C++【STL】(1)string
STL(C++标准模板库)
string
auto和范围for
auto
会自动推导类型,但不能直接初始化
int a=10;
auto b=a;
auto c='a';
范围for
自动推导类型,自动遍历
int array[]={1,2,3,4,5};
for(auto e:array)
{
cout<<e<<" ";
}
for(auto& e:array)//加上引用可以修改对象
{
e*=2;
}
string
string的底层实现(了解)
namespace bit
{class string{public:char& operator[](size_t pos)//运算符重载{assert(pos < _size);return _str[pos];}private:char* _str;size_t _size;size_t _capacity;};
}
基本用法
声明与初始化
在C++中,std::string
是标准库提供的字符串类,用于替代C风格字符数组(char*
或 char[]
),提供更安全、便捷的字符串操作。以下是 std::string
的核心知识点和用法:
#include <string>
using namespace std;string s1; // 空字符串
string s2 = "Hello"; // 直接初始化
string s3("World"); // 构造函数初始化
string s4(5, 'a'); // 重复字符:s4 = "aaaaa"
string s5(s2); // 拷贝初始化:s5 = "Hello"
输入输出
string input;
cin >> input; // 遇到空格停止(不包含空格)
getline(cin, input); // 读取整行(包含空格)
cout << input; // 输出字符串
常用操作
操作 | 示例 | 说明 |
---|---|---|
获取长度 | s.size() 或 s.length() | 返回字符数量(不含结尾的'\0' ) |
拼接字符串 | s1 + s2 或 s1.append(s2) | 直接相加或使用成员函数 |
访问字符 | s[0] 或 s.at(0) | [] 不检查越界,at() 会抛异常 |
清空字符串 | s.clear() | 清空内容,size() 变为0 |
判空 | s.empty() | 返回bool ,等价于 s.size() == 0 |
子字符串 | s.substr(pos, len) | 从pos 开始截取len 个字符 |
查找 | s.find("abc") | 返回首次出现的位置,失败返回string::npos |
替换 | s.replace(pos, len, "new_str") | 替换指定位置的子串 |
string 的遍历
#include<string>
int main()
{
string s1;//初始化
string s2("Hello world!");//初始化s2内容
//1.下标+[]
for(size_t =0;i<5;i++)
{
s2[i]+=1;//在s2中添加5个1
}
//打印string,size()可以替换为length()
for(size_t i=0;i<s2.size();i++)
{
cout<<s2[i]<<" ";
}
//2.迭代器(类比于指针)
string::iterator it=s2.begin();
while(it!=s2.end())//不用考虑/0的情况
{
cout<<*it<<" ";
++it;
}
cout<<endl;
}
** 与C风格字符串的转换**
- string → C字符串:
const char* cstr = s.c_str(); // 返回只读指针(以'\0'结尾)
- C字符串 → string:
char arr[] = "Hello"; string s = arr; // 直接赋值或构造
** 内存管理与性能**
- 动态内存分配:
std::string
自动管理内存,动态扩展容量。 - 预分配内存:
s.reserve(100); // 预分配100字符的内存,减少多次扩容开销
- 释放内存:
s.shrink_to_fit(); // 请求释放多余内存(依赖实现)
其他实用功能
字符串比较
if (s1 == s2) // 直接比较内容(区分大小写)
if (s1.compare(s2) == 0) // 等价于 ==
类型转换
- 数值 → 字符串:
string num_str = to_string(123); // C++11起支持
- 字符串 → 数值:
int num = stoi("456"); // stol(), stod()等
** 注意事项**
- 越界访问:使用
at()
代替[]
可避免未定义行为(但性能略低)。 - 修改字符串:
c_str()
返回的指针在修改字符串后可能失效。 - 性能优化:频繁拼接字符串时,使用
+=
或append()
更高效,或预分配内存。
综合使用
#include <iostream>
#include <string>
using namespace std;int main() {string s = "Hello";s += " C++"; // s = "Hello C++"s.replace(6, 3, "World"); // s = "Hello World"size_t pos = s.find("World");if (pos != string::npos) {cout << "Found at position: " << pos << endl; // 输出6}return 0;
}