专门做民宿的网站有哪些,精品网站免费,wordpress编辑文章中图片,中国七大网络运营商一、string类对象的常见构造 我们可采取以下的方式进行构造#xff0c;以下是常用的接口#xff1a;
//生成空字符串
string;
//拷贝构造函数
string(const string str);
//用C-string来构造string类对象
string(const char* s);
//string类对象中包含n个字符c
strin…一、string类对象的常见构造 我们可采取以下的方式进行构造以下是常用的接口
//生成空字符串
string;
//拷贝构造函数
string(const string str);
//用C-string来构造string类对象
string(const char* s);
//string类对象中包含n个字符c
string(size_t n, char c);
#includestring.h
#includeiostream
using namespace std;void test1()
{string s1; string s2(123456);string s3(s2);string s4(5, c);cout s1 endl;cout s2 endl;cout s3 endl;cout s4 endl;
}int main()
{test1();return 0;
} 二、string类对象的容量操作 这里主要对size、length、capacity、resize、reserve来进行讲解。 size与length大家都可顾名思义猜出其用途即返回String的大小。 capacity大家都有学习过顺序表的经验也可得出其为该容器的容量。 resize将字符串的大小调整为长度为 n 个字符。 clear清除字符串的内容使其变为一个空字符串长度为 0 个字符。这意味着将字符串中的所有字符都删除使其不包含任何字符长度为零。 // 测试string容量相关的接口
// size/clear/resize
void Teststring1()
{// 注意string类对象支持直接用cin和cout进行输入和输出string s(hello, C!!!);cout s.size() endl;cout s.length() endl;cout s.capacity() endl;cout s endl;// 将s中的字符串清空注意清空时只是将size清0不改变底层空间的大小s.clear();cout s.size() endl;cout s.capacity() endl;// 将s中有效字符个数增加到10个多出位置用a进行填充// “aaaaaaaaaa”s.resize(10, a);cout s.size() endl;cout s.capacity() endl;// 将s中有效字符个数增加到15个多出位置用缺省值\0进行填充// aaaaaaaaaa\0\0\0\0\0// 注意此时s中有效字符个数已经增加到15个s.resize(15);cout s.size() endl;cout s.capacity() endl;cout s endl;// 将s中有效字符个数缩小到5个s.resize(5);cout s.size() endl;cout s.capacity() endl;cout s endl;
}从该运行结果我们可以得出这个结论在VS编译器下resize在任何情况下都不会进行缩容 reserve请求更改容量。它指的是让字符串的容量适应计划中的大小更改使其长度最多达到 n 个字符。如果 n 大于当前字符串的容量该函数会导致容器将其容量增加到 n 个字符或更多。在其他所有情况下这被视为一个非约束性的收缩字符串容量的请求容器的实现可以自由进行其他优化并使字符串的容量大于 n。 接下来我们对其进行测试
void Teststring2()
{string s;// 测试reserve是否会改变string中有效元素个数s.reserve(100);cout s.size() endl;cout s.capacity() endl;// 测试reserve参数小于string的底层空间大小时是否会将空间缩小s.reserve(50);cout s.size() endl;cout s.capacity() endl;
} 我们可以看到reserve与resize一样在任何情况下都不会缩容 三、string类对象的遍历操作 对于string的访问这里提供三种方式 1. 利用库里的重载[]直接进行访问。 2.利用迭代器进行访问。 3.利用范围for其本质还是迭代器 void Teststring3()
{string s1(hello C);const string s2(Hello C);cout s1 s2 endl;cout s1[0] s2[0] endl;s1[0] H;cout s1 endl;// s2[0] h; 代码编译失败因为const类型对象不能修改string s(hello Bit);// 3种遍历方式// 需要注意的以下三种方式除了遍历string对象还可以遍历是修改string中的字符// 另外以下三种方式对于string而言第一种使用最多// 1. foroperator[]for (size_t i 0; i s.size(); i)cout s[i] endl;// 2.迭代器string::iterator it s.begin();while (it ! s.end()){cout *it endl;it;}// string::reverse_iterator rit s.rbegin();// C11之后直接使用auto定义迭代器让编译器推到迭代器的类型auto rit s.rbegin();while (rit ! s.rend())cout *rit endl;// 3.范围forfor (auto ch : s)cout ch endl;
}
四、string类对象的修改操作 push_back在字符串后尾插字符c append在字符串后追加一个字符串 operator 在字符串后追加字符串str c_str(重点)返回C格式字符串 find npos从字符串pos位置开始往后找字符c返回该字符在字符串中的位置 rfind从字符串pos位置开始往前找字符c返回该字符在字符串中的位置 substr在str中从pos位置开始截取n个字符然后将其返回 void Teststring4()
{string str;str.push_back( ); // 在str后插入空格str.append(hello); // 在str后追加一个字符hellostr C; // 在str后追加一个字符C str ; // 在str后追加一个字符串cout str endl;cout str.c_str() endl; // 以C语言的方式打印字符串// 获取file的后缀string file(string.cpp);size_t pos file.rfind(.);string suffix(file.substr(pos, file.size() - pos));cout suffix endl;// npos是string里面的一个静态成员变量// static const size_t npos -1;// 取出url中的域名string url(http://www.cplusplus.com/reference/string/string/find/);cout url endl;size_t start url.find(://);if (start string::npos){cout invalid url endl;return;}start 3;size_t finish url.find(/, start);string address url.substr(start, finish - start);cout address endl;// 删除url的协议前缀pos url.find(://);url.erase(0, pos 3);cout url endl;
} 五、vs下string的结构 string总共占28个字节内部结构稍微复杂一点先是有一个联合体联合体用来定义string中字符串的存储空间 当字符串长度小于16时使用内部固定的字符数组来存放 当字符串长度大于等于16时从堆上开辟空间 union _Bxty { // storage for small buffer or pointer to larger one// This constructor previously initialized _Ptr. Dont rely on the new behavior without// renaming _String_val (and fixing the visualizer)._CONSTEXPR20 _Bxty() noexcept : _Buf() {} // user-provided, for fancy pointers_CONSTEXPR20 ~_Bxty() noexcept {} // user-provided, for fancy pointersvalue_type _Buf[_BUF_SIZE];pointer _Ptr;char _Alias[_BUF_SIZE]; // TRANSITION, ABI: _Alias is preserved for binary compatibility (especially /clr)};_Bxty _Bx; 这种设计也是有一定道理的大多数情况下字符串的长度都小于16那string对象创建好之后内部已经有了16个字符数组的固定空间不需要通过堆创建效率高。 其次还有一个size_t字段保存字符串长度一个size_t字段保存从堆上开辟空间总的容量 最后还有一个指针做一些其他事情。 故总共占1644428个字节。 完