c++中定义一个字符串变量可以直接使用string
string str = "zyt";
string 有许多方法:
元素访问:
int main()
{
string str = "zytzytzythello";
//.length
int n = str.length();//可以获取字符串的长度
for (int i = 0; i < n; i++)
{
cout << str[i] << " ";//不会判断是否越界
}
cout << endl;
//.at访问指定字符,有边界检查
for (int i = 0; i < n; i++)
{
cout << str.at(i) << " ";//会判断是否越界
}
cout << endl;
//.c_str 访回字符串的不可修改的c字符数组版本,具有常性,不能改变字符串的内容
const char* p = str.c_str();
cout << p << endl;
//.data访回指向字符串首字符的指针,不具有常性,可以改变字符串的内容
char* cp = str.data();
cout << cp << endl;
//string 字符串底层还是一个数组,算个容器,也可以使用auto,基于范围的for的遍历打印
for (auto& x : str)
{
cout << x << " ";
}
cout << endl;
//也可以逆向打印
for (int i = str.size()-1; i >=0; --i)
{
cout << str[i] << " ";
}
cout << endl;
//.front访问首字符
cout << str.front() << endl;
//.back访问最后一个字符
cout << str.back() << endl;
return 0;
}
容量:
int main()
{
/*string 字符串刚开始开辟16字节大小的空间,后面还有个\0,
实际存储空间15个,当空间满了之后,又需要重新开辟空间,
再将原有空间的数据转移到新的空间,再释放原有的空间,
如果一直在添加字符串,这样效率就比较低*/
//.reserve 保留存储,刚开始直接开辟想要的空间大小
string str;
str.reserve(8000);//直接将空间开辟到8000字节
return 0;
}
string 的空间大小如何增长
//空间增量
int main()
{
string str;
for (int i = 0; i < 300; ++i)
{
//str.size()打印当前字符串大小,str.capacity()打印当前字符串开辟的空间大小
cout << str.size() << " " << str.capacity() << " ";
//字符串开辟的空间使用‘a’填充
str.push_back('a');
}
cout << str << endl;
return 0;
刚开始按1倍增长,后面按1.5增长
int main()
{
string str;
str.reserve(400);//刚开始就申请400个字节
cout << str.capacity() << endl;
return 0;
}
我们可以看出,刚开始直接申请400字节的空间,实际系统开辟的空间大于申请的空间。
操作:
int main()
{
string str;
char ch;
//.push_back字符串结尾添加字符
while (cin.get(ch), ch != '\n')
{
str.push_back(ch);
}
cout << str << endl;
//向字符串中输入字符串
string stra;
string tmp;
while (cin >> tmp, tmp != "end")
{
str += tmp + ' ';//字符串之间可以直接用+连接
}
cout << str << endl;
//.clear 清除字符串
str.clear();
cout << str << endl;
return 0;
}
迭代器
int main()
{
string str = "zytzytzythello";
//iterator 正向迭代器 .begin 正向访问
string::iterator ip = str.begin();
for (; ip != str.end(); ++ip)
{
cout << *ip << " ";
}
cout << endl;
//reverse_iterator 逆向迭代器 .begin 逆向访问
string::reverse_iterator cp = str.rbegin();
for (; cp != str.rend(); ++cp)
{
cout << *cp << " ";
}
cout << endl;
return 0;
}
|