string
string
string其实不属于STL,而是属于C++标准库,这是历史原因。
使用string类需要包string头文件
文档介绍 string - C++ Reference (cplusplus.com)
构造函数
string() 默认构造,构造一个空的string类对象,即空字符串
string(const string& str) 拷贝构造
string(const char s)* 用C-string 字符串构造 string 类对象
常用接口
遍历
//重载 operator[] 使得string像数组一样访问
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;返回string字符串的字节个数(就是字符数)
size_t size() const;
-
string str("hello world"); for(int i = 0;i < str.size();i++){cout << str[i] << " "; }
-
迭代器 iterator
-
STL普遍提供了iterator对象的接口,比如string的begin和end函数,可以返回string对象的第一个位置和最后一个位置下一个位置的迭代器。
-
iterator begin();
-
iterator end();
-
string str("hello world"); string::iterator it = str.begin(); while(it != str.end()){cout << *it << " ";++it; }
-
迭代器不是指针,但是和指针很类似,*it是运算符重载的结果。
-
迭代器it可以改变string本身内容
-
-
范围for
-
string str("hello world"); for(auto ch : s){cout << ch << " "; }
-
auto 自动推导类型
-
实际上底层是迭代器
-
范围for 取到的ch只是拷贝,写成auto是不能修改string本身内容的
-
使用auto&就可以改变string本身内容了
string str("hello world");for(auto& ch : s){cout << ch << " ";}
-
迭代器类型
iterator 正向迭代器
reverse_iterator 反向迭代器
const_iterator 常限定正向迭代器
const_reverse_iterator 常限定反向迭代器
string容量操作接口
size_t size() const;
size_t capacity() const;
bool empty() const; //判空
void clear(); //清除有效字符,size置零,capacity不变,不会缩容
void reserve(size_t n = 0);
reserve介绍
reserve是储存的意思,对于string这样动态的数据结构,频繁的扩容会有很多消耗(异地扩,释放,拷贝),因此如果一开始就知道初始时有多少空间,直接就给好空间,效率就会提高很多。
string s1;
s1.reserve(100);
注意:当参数n大于当前capacity时毫无疑问会扩容,但是当n小于capacity时,是否会缩容其实是不确定的,由不同的编译器来决定,比如vs下不会缩容,但是g++下会缩容。
要注意的是reserve的行为不会对size以及字符串内容造成影响。
练习:415. 字符串相加 - 力扣(LeetCode)
增删查改接口
尾插
void push_back(char c); //尾插一个字符
string& append(字符串); //尾插字符串,返回操作后的字符串引用
string& operator+=(字符串对象/C字符串、单字符均可);
(头)插入
string& insert(size_t pos,const string& str); //pos位置插入string对象
string& insert(size_t pos,const char* s); //pos位置插入c字符数组
string& insert(size_t pos,size_t n,char c); //pos位置插入n个单字符
iterator insert(iterator p,char c); //迭代器位置插入单字符
删除
string& erase(size_t pos = 0;size_t len = npos); //默认清除
iterator erase(iterator p); //删除迭代器位置单字符
iterator erase(iterator first,iterator last); //删除迭代器位置字符串
替换,查找 replace,find
//find系列
rfind //倒着找
find_first_of //在字符串里查找传入字符串里面的任何字符
find_last_of //倒着的find_first_of
find_first_not_of
find_last_not_of
兼容C语言
const char* c_str()const;
//这个函数的作用其实时为了C++对C语言的兼容
//作用: 获取C字符串的等效项
//返回一个指向数组的指针,该数组包含以 null('\0') 结尾的字符序列即C字符串,此数组包含构成字符串对象值的相同字符序列,以及末尾的附加终止'\0'字符.
非成员函数接口
string operator+(,)//字符串与字符串相加,字符串与C字符数组/字符相加,C字符数组/字符与字符串相加
//重载成全局原因在于参数位置可以互换(加法交换律。。)
string还实现了各种运算符重载
//getline 解决了cin接收字符串遇到' '结束的问题
//getline 默认遇到\n结束
istream& getline (istream& is, string& str, char delim);//可以传入参数自定义终止字符为delim
istream& getline (istream& is, string& str); //默认种植字符为'\n'
字符串最后一个单词的长度_牛客题霸_牛客网
string substr(size_t pos,size_t len);
返回原字符串从pos位置开始的len个字符的子串
实现string重载流插入和流提取
inline ostream& operator<<(ostream& cout, const string& str)
{for (auto ch : str){cout << ch;}return cout;
}inline istream& operator>>(istream& cin, string& str)
{str.clear();char ch = cin.get();while (ch != ' ' && ch != '\n'){str += ch;ch = cin.get();}return cin;
}
重载operator>>中涉及到C++中cin默认以‘ ’和’\n’为分隔符,提取不到’ ‘和’\n’,故不能使用cin,应当调用istream对象的get()函数(可以取到任何字符),用法和getc()类似。