温泉酒店网站建设方案,两学一做网站专栏怎么设置,网站建设推广服务商,新沂网站开发目录 一、成员访问
1、[ ]at
2、front( )back( ) 二、插入元素
三、删除元素
四、替换元素
五、查找元素
1、查找第一次出现位置
2 、在指定范围内查找
六、交换字符串
七、c_str
八、rfindsubstr 一、成员访问
1、[ ]at 虽然二者功能一样at
2、front( )back( ) 二、插入元素
三、删除元素
四、替换元素
五、查找元素
1、查找第一次出现位置
2 、在指定范围内查找
六、交换字符串
七、c_str
八、rfindsubstr 一、成员访问
1、[ ]at 虽然二者功能一样但[ ]比较常用。 int main()
{string s1(hello world);cout s1[4] endl;cout s1.at(4) endl;return 0;
} 访问越界[ ]会直接报错.at( )会抛异常。 int main()
{string s1(hello world);try {s1.at(100);}catch (const exception e) {cout e.what() endl;}return 0;
} 2、front( )back( ) int main()
{string s1(hello world);cout s1.back() endl;cout s1.front() endl;return 0;
} 二、插入元素 insert/erase不推荐经常使用能少用就少用因为他们可能都存在要挪动数据效率低下。 指定位置插入字符串。 int main()
{string s1(world);s1.insert(0, hello);cout s1 endl;return 0;
} 指定位置插入单个字符 s1.insert(0, w); 两种方式指定位置插入空字符 使用单引号需要加上插入字符个数(第二个参数)使用双引号不需要。 int main()
{string s1(world);s1.insert(2, 1, );s1.insert(3, );cout s1 endl;return 0;
} 插入可以借助迭代器的begin()和end()获取位置。 s1.insert(s1.begin()2, );
s1.insert(s1.end() - 1, ); 三、删除元素 insert/erase不推荐经常使用能少用就少用因为他们可能都存在要挪动数据效率低下。 删除指定位置指定长度字符。 int main()
{string s2(hello world);s2.erase(5, 1);cout s2 endl;return 0;
} 也可以使用迭代器。 s2.erase(s2.begin() 5); 如果长度大于字符串长度或者缺省则删除指定位置开始一直到最后的字符。 s2.erase(5, 30);s2.erase(5); 四、替换元素 replace()函数的第一个参数是替换的起始位置第二个参数是要替换的字符数第三个参数是替换的字符串。 int main()
{string s1(hello world);s1.replace(5, 1, );cout s1 endl;return 0;
}
首先代码中的第一行是被注释掉的表示字符串s1被初始化为hello world。这是一个注释行不会被执行。然后使用s1.replace(5, 1, )函数调用来替换字符串s1中从索引位置5开始的1个字符将其替换为。接下来使用cout对象和运算符将修改后的字符串s1输出到标准输出流。 使用replace时空间不够扩容还要移动数据。 五、查找元素
1、查找第一次出现位置 find()用于在字符串中查找指定子串的第一个出现位置。 find()函数有多个重载版本其中最常用的版本接受一个参数即要查找的子串。它返回一个整数值表示子串在字符串中的位置索引。如果找到了子串则返回第一个匹配的位置索引如果未找到子串则返回一个特殊的值std::string::npos。
int main()
{string s1(hello world I love you);size_t pos s1.find( );while (pos ! string::npos) {s1.replace(pos, 1, ***);pos s1.find( );}cout s1 endl;return 0;
} 我们可以对上述程序进行优化。 int main()
{string s1(hello world I love you);size_t num 0;for (auto ch : s1) {if (ch )num;}s1.reserve(s1.size() 2 * num);size_t pos s1.find( );while (pos ! string::npos) {s1.replace(pos, 1, ***);pos s1.find( ,pos3);}cout s1 endl;return 0;
}
首先在代码中创建了一个名为s1的字符串对象并将其初始化为hello world I love you。
然后使用一个循环遍历字符串s1中的每个字符。在循环中如果当前字符是空格则将计数器num加1。
接下来使用s1.reserve(s1.size() 2 * num)函数调整字符串s1的容量以便能够容纳替换后的字符串。这样做是为了避免在替换过程中频繁地重新分配内存提高性能。
然后使用s1.find( , pos)函数来查找字符串s1中下一个空格的位置。如果找到了空格将其位置存储在变量pos中。
接下来使用s1.replace(pos, 1, ***)函数将找到的空格替换为三个星号***。这样做会修改字符串s1中的内容。
然后使用pos s1.find( , pos 3)来查找下一个空格的位置从上一个空格的位置加3开始查找。这样做是为了避免重复替换已经被替换过的空格。
循环会一直执行直到没有更多的空格被找到。
最后使用cout对象和运算符将修改后的字符串s1输出到标准输出流。 还可以使用运算符进一步优化。 int main()
{string s1(hello world I love you);string newStr;size_t num 0;for (auto ch : s1) {if (ch ! )num;}newStr.reserve(s1.size() 2 * num);for (auto ch : s1) {if (ch ! )newStr ch;elsenewStr ***;}s1 newStr;
}
与之前的版本相比这段程序是对第一段程序的改进版本具有以下特点和优点 更简洁第二段程序使用了更简洁的方法来替换字符串中的空格避免了使用循环和查找函数。 更高效第二段程序只需遍历一次原始字符串而不是使用循环和查找函数多次遍历。这样可以减少时间复杂度提高程序的执行效率。 更易读第二段程序使用了更直观的方式来替换空格通过判断字符是否为空格来决定添加字符还是添加***。这样代码更易读懂减少了冗余的操作。 更节省内存第二段程序使用了新的字符串newStr来存储替换后的结果避免了对原始字符串s1进行频繁的修改。这样可以减少内存的使用提高程序的效率。
2 、在指定范围内查找
六、交换字符串
int main()
{string s1(hello world);string s2(xxxxx);s1.swap(s2);cout s1 endl;cout s2 endl;swap(s1, s2);cout s1 endl;cout s2 endl;
} 这段程序中的两个swap函数调用有以下区别 s1.swap(s2)这是成员函数形式的swap调用它将s1和s2两个字符串对象进行交换。在交换后s1的值变为xxxxxs2的值变为hello world。这种形式的swap函数是通过成员函数调用来实现的。 swap(s1, s2)这是非成员函数形式的swap调用它通过传递s1和s2两个字符串对象作为参数来进行交换。在交换后s1的值变为hello worlds2的值变为xxxxx。这种形式的swap函数是通过非成员函数调用来实现的。
总结起来这两个swap函数的功能是一样的都是用于交换两个字符串对象的值。区别在于调用方式不同一个是通过成员函数调用一个是通过非成员函数调用。使用哪种形式的swap函数取决于个人偏好和代码风格。 七、c_str
int main()
{string s1(hello world);cout s1 endl;cout s1.c_str() endl;return 0;
} cout s1 endl;这行代码将字符串对象s1直接输出到标准输出流cout中。它会输出s1的内容即字符串 hello world。 cout s1.c_str() endl;这行代码使用了字符串对象s1的c_str()成员函数。c_str()函数返回一个指向以空字符结尾的字符数组C风格字符串的指针。然后该指针被传递给cout输出流进行输出。它也会输出s1的内容即字符串 hello world。
区别在于输出的方式不同。第一行直接输出字符串对象s1的内容而第二行使用了c_str()函数将字符串对象转换为C风格字符串后输出。通常情况下直接输出字符串对象更为简洁和方便。 int main()
{string s1(hello world);cout s1 endl;cout s1.c_str() endl;s1 \0;s1 \0;s1 xxxxx;cout s1 endl;cout s1.c_str() endl;return 0;
}
可以看到通过对s1进行修改操作后输出结果中的空字符\0在字符串对象s1的输出中仍然存在但在c_str()函数返回的C风格字符串中被忽略了。这是因为c_str()函数会将字符串以空字符结尾而在输出时遇到空字符就会停止输出。 我们逐步解释为什么输出结果会有所不同。
初始状态下s1的值为hello world。 cout s1 endl;输出s1的内容即字符串 hello world。 cout s1.c_str() endl;输出s1的C风格字符串表示即 hello world。 s1 \0;在s1末尾添加一个空字符\0此时s1的值变为 hello world\0。 s1 \0;再次在s1末尾添加一个空字符\0此时s1的值变为 hello world\0\0。 s1 xxxxx;将字符串 xxxxx 追加到s1的末尾此时s1的值变为 hello world\0\0xxxxx。 cout s1 endl;输出s1的内容即 hello world\0\0xxxxx。 cout s1.c_str() endl;输出s1的C风格字符串表示即 hello world。这里需要注意c_str()函数返回的是以空字符结尾的字符数组输出时遇到第一个空字符就会停止输出。
八、rfindsubstr rfind函数用于在一个字符串中从后往前搜索指定的子字符串并返回子字符串的位置。 它的语法如下
size_t rfind(const string str, size_t pos string::npos) const;str是要搜索的子字符串pos是搜索的起始位置默认为string::npos表示从字符串的末尾开始搜索。 substr函数用于从一个字符串中提取子字符串。它的语法如下
string substr(size_t pos 0, size_t len string::npos) const;其中pos是要提取的子字符串的起始位置默认为0len是要提取的子字符串的长度默认为string::npos表示提取从起始位置到字符串末尾的所有字符。 接下来看下面代码 int main()
{string file(string.cpp.tar.zip);size_t pos file.rfind(.);if (pos ! string::npos){string suffix file.substr(pos);cout suffix endl;}return 0;
}这段代码的目的是提取文件名中的后缀名。
首先定义了一个字符串file其中包含了一个文件名string.cpp.tar.zip。
然后使用rfind函数从后往前搜索.字符的位置并将结果保存在变量pos中。如果找到了.字符则pos的值不等于string::npos。
接下来通过判断pos的值是否不等于string::npos来确定是否找到了.字符。如果找到了则使用substr函数从pos位置开始提取子字符串并将结果保存在变量suffix中。
最后将提取到的后缀名输出到标准输出流cout中然后换行。
在这个例子中输出结果为.zip因为.字符后面的部分就是文件的后缀名。 从URL中提取主机地址 int main()
{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;}start 3;size_t finish url.find(/, start);string address url.substr(start, finish - start);cout address endl;return 0;
}使用find函数搜索字符串url中第一次出现的子字符串://的位置并将结果保存在变量start中。如果找不到该子字符串则start的值等于string::npos。
接下来通过判断start的值是否等于string::npos来确定是否找到了://子字符串。如果没有找到则输出invalid url表示URL无效。
如果找到了://子字符串则将start的值增加3以跳过://部分然后使用find函数搜索从start位置开始的下一个/字符的位置并将结果保存在变量finish中。
最后使用substr函数从start位置开始提取从start到finish之间的子字符串并将结果保存在变量address中将提取到的主机地址输出到标准输出流cout中然后换行。