博客主页:【夜泉_ly】
本文专栏:【C++】
欢迎点赞👍收藏⭐关注❤️
文章目录
- 💡前言
- 💡修改
- 1.operator= 与 assign
- 1.1函数原型
- 1.2用法速览
- 1.3注意事项
- 2.operator+= 与 append 、push_back
- 2.1函数原型
- 2.2用法速览
- 2.3注意事项
- 3.insert 、erase
- 3.1函数原型
- 3.2用法速览
- 4.其他
- 4.1swap
- 4.2pop_back
- 4.3replace
💡前言
在这篇文章中,我将继续简单探讨 C++
中 string
的基本用法。写这篇文章的主要目的是帮助我巩固所学的知识,同时也便于未来的复习和参考。
如果你想大致的了解string
的基本用法,也可以留下来看看。
对于那些希望深入学习更多细节的读者,可以去看看这个网站:cplusplus.com,以获取更全面的参考资料,网站上有丰富的文档和示例代码,能够帮助你更好地理解和运用 string
。
💡修改
1.operator= 与 assign
将operator=
与assign
放在一起是因为它们的功能基本相似,都是将给定内容分配给string
类对象。
一般常用operator=
,如果有特殊需要,可以用assign
。
1.1函数原型
operator=
string& operator= (const string& str);
string& operator= (const char* s);
string& operator= (char c);
assign
string& assign (const string& str);
string& assign (const string& str, size_t subpos, size_t sublen);
string& assign (const char* s);
string& assign (const char* s, size_t n);
string& assign (size_t n, char c);
template <class InputIterator>
string& assign (InputIterator first, InputIterator last);
1.2用法速览
使用operator=或assign时,会覆盖原串的内容。
这种特性需要注意,以避免无意中丢失重要数据。
-
operator=
void Test() {//operator= 用于构造string s1 = "Hello World";string s2 = s1;cout << "s1-" << s1 << endl;cout << "s2-" << s2 << endl;string s3;//operator= 用于赋值s3 = '6';s1 = s3;s2 = '6';s3 = "Hello World";cout << "s1-" << s1 << endl;cout << "s2-" << s2 << endl;cout << "s3-" << s3 << endl; }
Output:
s1-Hello World s2-Hello World s1-6 s2-6 s3-Hello World
-
assign
其实用得不多,因为再建一个对象就行了。虽然assign
提供了更丰富的功能,但实际上在许多应用场景中,由于使用新对象来初始化其实是更清晰的。因此,平时开发中多使用operator=
是个不错的选择。
1.3注意事项
虽然有string& operator= (char c);
,但只能用于赋值,不能用于构造。
void Test()
{string str = '0';
}
这种语法会导致错误,因为不支持char
到string
的初始化:
2.operator+= 与 append 、push_back
将operator+=
与 append
、push_back
,放在一起也是因为它们的功能相似,都是添加新的内容。
一般常用operator+=
,如果有特殊需要,可以用append
、push_back
。
2.1函数原型
operator+=
string& operator+= (const string& str);
string& operator+= (const char* s);
string& operator+= (char c);
append
string& append (const string& str);
string& append (const string& str, size_t subpos, size_t sublen);
string& append (const char* s);
string& append (const char* s, size_t n);
string& append (size_t n, char c);
template <class InputIterator>
string& append (InputIterator first, InputIterator last);
push_back
void push_back (char c);
2.2用法速览
能简单直接地将内容加到字符串的末尾。
void Test()
{string str;str += string("Hello");//Hellostr += " World";//Hello Worldstr += '!';//Hello World!cout << str << endl;str = string();str.append(string("Hello"));//Hellostr.append(string("Hello World"), 5, 1);//Hello+空格str.append("World");//Hello Worldstr.append("!!!!!", 1);//Hello World!str.append(1,'!');//Hello World!!cout << str << endl;str.push_back('!');//Hello World!!!cout << str << endl;
}
Output:
Hello World!
Hello World!!
Hello World!!!
2.3注意事项
使用上,这几个函数是很安全的,一般情况都不会报错。
效率方面,如果已知了所需空间的大小,可以先通过reserve
开空间,可以减少频繁申请空间带来的消耗。
3.insert 、erase
将这两个函数放在一起是因为它们都很好用,但用的不多。
其原因是频繁的插入和删除可能会对性能产生较大影响,这里可类比顺序表的头插、头删。
但一些oj题的小型字符串应该没啥问题吧,我是这样想的,所以还是看了看。
3.1函数原型
insert
string& insert (size_t pos, const string& str);string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);string& insert (size_t pos, const char* s);string& insert (size_t pos, const char* s, size_t n);string& insert (size_t pos, size_t n, char c);void insert (iterator p, size_t n, char c);
iterator insert (iterator p, char c);
template <class InputIterator>void insert (iterator p, InputIterator first, InputIterator last);
erase
string& erase (size_t pos = 0, size_t len = npos);
iterator erase (iterator p);
iterator erase (iterator first, iterator last);
3.2用法速览
void Test()
{string str;str.insert(0, string(1, 'H'));//Hstr.insert(1, string("Hello World"), 1, 4);//Hellostr.insert(str.size(), " World");//Hello Worldstr.insert(str.size(), "!!!!!", 1);//Hello World!str.insert(str.size(), 2, '!');//Hello World!!!cout << str << endl;str.erase(str.size() - 2, 3);//Hello Worldcout << str << endl;str.erase(str.begin(), str.end());//""str = "666";str.erase();//""cout << str << endl;
}
Output:
Hello World!!!
Hello World!
4.其他
4.1swap
void swap (string& str);
交换两个string
类对象,
void Test()
{string str1, str2;str2 = "Hello World";str1.swap(str2);cout << "str1:"<<str1 << " size1:"<<str1.size() <<" capacity1:" << str1.capacity() << endl;cout << "str2:"<<str2 << " size2:"<<str2.size() <<" capacity2:" << str2.capacity() << endl;
}
括号外面可以是匿名对象:
string str1;
string("666666").swap(str1);
cout << str1;
相当于将 "666666"
赋给 str1
。
Output:
666666
4.2pop_back
void pop_back();
尾删,但用于空串会导致未定义行为,VS上会断言:
4.3replace
最不好用的一个:
刚看到函数原型就直接劝退了,这里建议要用的时候再查文档。
希望本篇文章对你有所帮助!并激发你进一步探索编程的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!