C++容器string
C++容器string
- 定义
- std::string (char)
- std::wstring (wchar_t)
- std::u8string (char8_t) (C++20引入)
- std::u16string (char16_t)
- std::u32string (char32_t)
 
- 构造函数
- 1、无参构造函数
- 2、基于C语言字符串
- 3、基于C语言字符串前面几个
- 4、拷贝构造函数
- 5、移动构造函数
- 6、基于字符和重复次数构造函数
- 7、迭代器范围构造函数
- 8、初始化列表构造函数
 
- 赋值操作
- 1、运算符赋值
- 2、方法赋值
 
- 元素访问
- 1、下标访问
- 2、首尾元素访问
- 3、C语言风格访问
 
- 容量大小
- 1、容量大小查询
- 2、容量大小改变
- 3、短字符串优化(SSO)
 
- 修改操作
- 1、拼接操作
- 2、插入操作
- 3、删除操作
- 4、替换操作
- 5、交换移动
 
- 查找操作
- 截取操作
- 比较操作
- 1、运算符比较
- 2、方法比较
 
- 迭代器操作
定义
https://cppreference.cn/w/cpp/string/basic_string
std::string是std::basic_string<char>的 typedef
| 类型 | 定义 | 
|---|---|
| std::string | std::basic_string | 
| std::wstring | std::basic_string<wchar_t> | 
| std::u8string(C++20) | std::basic_string<char8_t> | 
| std::u16string(C++11) | std::basic_string<char16_t> | 
| std::u32string(C++11) | std::basic_string<char32_t> | 
| std::pmr::string(C++17) | std::pmr::basic_string | 
| std::pmr::wstring(C++17) | std::pmr::basic_string<wchar_t> | 
| std::pmr::u8string(C++20) | std::pmr::basic_string<char8_t> | 
| std::pmr::u16string(C++17) | std::pmr::basic_string<char16_t> | 
| std::pmr::u32string(C++17) | std::pmr::basic_string<char32_t> | 
_EXPORT_STD using string  = basic_string<char, char_traits<char>, allocator<char>>;
_EXPORT_STD using wstring = basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t>>;
#ifdef __cpp_lib_char8_t
_EXPORT_STD using u8string = basic_string<char8_t, char_traits<char8_t>, allocator<char8_t>>;
#endif // defined(__cpp_lib_char8_t)
_EXPORT_STD using u16string = basic_string<char16_t, char_traits<char16_t>, allocator<char16_t>>;
_EXPORT_STD using u32string = basic_string<char32_t, char_traits<char32_t>, allocator<char32_t>>;
新项目优先使用UTF-8( C++20使用
std::u8string;C++20 前使用std::string存储 UTF-8)
| 类型 | 字符大小 | 编码 | 主要使用场景 | 可移植性 | 内存效率 | 
|---|---|---|---|---|---|
| string | 1字节,无前缀或u8前缀(C++11起) | 本地/UTF-8 | 通用、网络、文件 | 高 | 高(ASCII) | 
| wstring | 2/4字节,使用L前缀 | 系统相关 | Windows API | 低 | 中等 | 
| u8string | 1字节,使用u8前缀 | UTF-8 | 现代UTF-8处理, C++20 起处理 UTF-8 的标准选择 | 高 | 高 | 
| u16string | 2字节,使用u前缀 | UTF-16 | Qt、Windows、Java 交互 | 中等 | 中等 | 
| u32string | 4字节,使用U前缀 | UTF-32 | Unicode 处理、算法 | 高 | 低 | 
std::string (char)
注意存放中文字符(或表情字符)的时候,一个汉字占用多个字符,遍历的时候需要特殊处理,否则跟
Java一样需要通过codepoint来处理
字符类型:char(通常8位,有符号或无符号取决于实现)
编码:
- 传统上用于 ASCII 或本地编码(如 GB2312、Shift-JIS)
- 现代实践中常用于 UTF-8 编码
- C++20 引入 char8_t后,UTF-8 应优先使用u8string
 内存: 每个字符1字节
	std::string str1 = "Hello World";std::cout << "str1 length: " << str1.length() << " >> " << str1.size() << std::endl;std::string str2 = "Hello 张三";std::cout << "str2 length: " << str2.length() << " >> " << str2.size() << std::endl;// 这里遍历中文字符比较诡异for (auto it = str2.begin(); it != str2.end(); it++){std:cout << "->>" << *it << endl;}
std::wstring (wchar_t)
字符类型: wchar_t (长度由具体系统决定)
 编码:
- Windows: UTF-16 (2字节或4字节,通常是2字节)
- Linux/Unix: UTF-32 (4字节)
- macOS: UTF-32 (4字节)
 内存:
- Windows: 通常2字节/字符
- 其他系统: 通常4字节/字符
	std::wstring str1 = L"Hello World";std::cout << "str1 length: " << str1.length() << " >> " << str1.size() << std::endl;std::wstring str2 = L"Hello 张三";std::cout << "str2 length: " << str2.length() << " >> " << str2.size() << std::endl;
std::u8string (char8_t) (C++20引入)
字符类型: char8_t (8位无符号)
 编码: 严格 UTF-8
 内存: 每个字符1字节(但一个 Unicode 码点可能占用1-4个字节)
	std::u8string str1 = u8"Hello World";std::cout << "str1 length: " << str1.length() << " >> " << str1.size() << std::endl;std::u8string str2 = u8"Hello 张三";std::cout << "str2 length: " << str2.length() << " >> " << str2.size() << std::endl;
std::u16string (char16_t)
字符类型: char16_t (16位无符号)
 编码: UTF-16
 内存: 每个字符2字节(基本多文种平面 BMP 字符占1个单元,辅助平面字符占2个单元 - 代理对
std::u16string str1 = u"Hello World";
std::cout << "str1 length: " << str1.length() << " >> " << str1.size() << std::endl;std::u16string str2 = u"Hello 张三";
std::cout << "str2 length: " << str2.length() << " >> " << str2.size() << std::endl;
std::u32string (char32_t)
字符类型: char32_t (32位无符号)
 编码: UTF-32
 内存: 每个字符4字节(每个 Unicode 码点正好占用1个字符单元)
	std::u32string str1 = U"Hello World";std::cout << "str1 length: " << str1.length() << " >> " << str1.size() << std::endl;std::u32string str2 = U"Hello 张三";std::cout << "str2 length: " << str2.length() << " >> " << str2.size() << std::endl;
构造函数
https://cppreference.cn/w/cpp/string/basic_string/basic_string
1、无参构造函数
std::u8string getU8stringFromString(const std::string& input) {return std::u8string(reinterpret_cast<const char8_t*>(input.data()), input.size());
}std::string getStringFromU8string(const std::u8string& input) {return std::string(reinterpret_cast<const char*>(input.data()), input.size());
}int main()
{std::u8string str1;std::cout << getStringFromU8string(str1) << "str1 length: " << str1.length() << std::endl;std::u8string str2 = std::u8string();std::cout << getStringFromU8string(str2) << "str2 length: " << str2.length() << std::endl;
}
2、基于C语言字符串
string(const char* s)
int main()
{system("chcp 65001");const char8_t* cstr = u8"Hello World 张三";std::u8string str1 = std::u8string(cstr);std::cout << getStringFromU8string(str1) << ", str1 length: " << str1.length() << ", address=" << &str1 << std::endl;
}
3、基于C语言字符串前面几个
string(const char* s, size_t count)
count大于字符串长度,会有诡异问题(会用内存中无用内容填充)
int main()
{system("chcp 65001");const char8_t* cstr = u8"Hello World 张三";std::u8string str1 = std::u8string(cstr, 5);std::cout << getStringFromU8string(str1) << ", str1 length: " << str1.length() << ", address=" << &str1 << std::endl;
}
4、拷贝构造函数
int main()
{system("chcp 65001");std::u8string str1 = std::u8string(u8"Hello 张三");// 拷贝构造函数std::u8string str2 = std::u8string(str1);std::cout << getStringFromU8string(str1) << ", str1 length: " << str1.length() << ", address=" << &str1 << std::endl;std::cout << getStringFromU8string(str2) << ", str2 length: " << str2.length() << ", address=" << &str2 << std::endl;
}
5、移动构造函数
int main()
{system("chcp 65001");std::u8string str1 = std::u8string(u8"Hello 张三");// 移动构造函数std::u8string str2 = std::u8string(std::move(str1));std::cout << getStringFromU8string(str1) << ", str1 length: " << str1.length() << ", address=" << &str1 << std::endl;std::cout << getStringFromU8string(str2) << ", str2 length: " << str2.length() << ", address=" << &str2 << std::endl;
}
6、基于字符和重复次数构造函数
int main()
{system("chcp 65001");std::u8string str1 = std::u8string(4, 'A');std::cout << getStringFromU8string(str1) << ", str1 length: " << str1.length() << ", address=" << &str1 << std::endl;
}
7、迭代器范围构造函数
int main()
{system("chcp 65001");std::u8string input = u8"hello测试数据";// 范围构造函数std::u8string str1 = std::u8string(input.begin() + 1, input.end() - 1);std::cout << getStringFromU8string(str1) << ", str1 length: " << str1.length() << ", address=" << &str1 << std::endl;
}
8、初始化列表构造函数
int main()
{system("chcp 65001");std::u8string str1{ 'H', 'e', 'l', 'l', 'o' };std::u8string str2 = u8"张三";std::cout << getStringFromU8string(str1) << ", str1 length: " << str1.length() << ", address=" << &str1 << std::endl;std::cout << getStringFromU8string(str2) << ", str2 length: " << str2.length() << ", address=" << &str2 << std::endl;
}
赋值操作
1、运算符赋值
int main()
{system("chcp 65001");std::u8string str1 = u8"Hello World 张三";std::u8string str2 = std::move(str1);std::cout << getStringFromU8string(str1) << ", str1 length: " << str1.length() << ", address=" << &str1 << std::endl;std::cout << getStringFromU8string(str2) << ", str2 length: " << str2.length() << ", address=" << &str2 << std::endl;
}
2、方法赋值
int main()
{system("chcp 65001");std::u8string str1;// 从 C 字符串赋值str1.assign(u8"Hello");str1.assign(u8"World", 3);std::cout << getStringFromU8string(str1) << ", str1 length: " << str1.length() << ", address=" << &str1 << std::endl;// 重复字符赋值str1.assign(5, '&');std::cout << getStringFromU8string(str1) << ", str1 length: " << str1.length() << ", address=" << &str1 << std::endl;// 从其他 string 赋值std::u8string other = u8"张三";str1.assign(other);str1.assign(other, 0, 7);std::cout << getStringFromU8string(str1) << ", str1 length: " << str1.length() << ", address=" << &str1 << std::endl;// 迭代器范围赋值str1.assign(other.begin(), other.begin() + 4);std::cout << getStringFromU8string(str1) << ", str1 length: " << str1.length() << ", address=" << &str1 << std::endl;
}
元素访问
1、下标访问
int main()
{system("chcp 65001");std::u8string str1 = u8"hello张三";// 中文显示很诡异std::cout << getStringFromU8string(std::u8string(1, str1[0])) << std::endl;std::cout << getStringFromU8string(std::u8string(1, str1.at(1))) << std::endl;// 修改str1[0] = u8'w';str1.at(1) = u8'o';std::cout << getStringFromU8string(std::u8string(1, str1[0])) << std::endl;std::cout << getStringFromU8string(std::u8string(1, str1.at(1))) << std::endl;
}
2、首尾元素访问
int main()
{system("chcp 65001");std::u8string str1 = u8"hello张三";// 中文显示很诡异std::cout << getStringFromU8string(std::u8string(1, str1.front())) << std::endl;std::cout << getStringFromU8string(std::u8string(1, str1.back())) << std::endl;// 修改str1.front() = u8'w';str1.back() = u8'o';std::cout << getStringFromU8string(std::u8string(1, str1.front())) << std::endl;std::cout << getStringFromU8string(std::u8string(1, str1.back())) << std::endl;
}
3、C语言风格访问
int main()
{system("chcp 65001");std::u8string str1 = u8"hello张三";const char8_t* cstr = str1.c_str();const char8_t* data = str1.data();std::cout << getStringFromU8string(++cstr) << std::endl;std::cout << getStringFromU8string(data++) << std::endl;
}
容量大小
| 操作方法 | 功能描述 | 示例 | 
|---|---|---|
| []操作符 | 访问指定位置字符(不检查边界) | char c = str[0]; | 
| at() | 访问指定位置字符(检查边界) | char c = str.at(0); | 
| length()/size() | 获取字符串长度 | int len = str.size(); | 
| capacity() | 获取当前分配的内存容量 | int cap = str.capacity(); | 
| empty() | 检查字符串是否为空 | if (str.empty()) {...} | 
1、容量大小查询
int main()
{system("chcp 65001");std::u8string str1 = u8"hello张三";std::cout << "str1.length()= " << str1.length() << std::endl;std::cout << "str1.size()= " << str1.size() << std::endl;std::cout << "str1.capacity()= " << str1.capacity() << std::endl;std::cout << "str1.empty()= " << boolalpha << str1.empty() << std::endl;
}
2、容量大小改变
int main()
{system("chcp 65001");std::u8string str1 = u8"hello张三";// 多余字符被截取str1.resize(3);std::cout << "str1.resize()= " << getStringFromU8string(str1) << '\t' << str1.length() << '\t' << str1.capacity() << std::endl;// 多余空间赋指定值str1.resize(8, '&');std::cout << "str1.resize()= " << getStringFromU8string(str1) << '\t' << str1.length() << '\t' << str1.capacity() << std::endl;// 多余空间不赋值str1.resize(10);std::cout << "str1.resize()= " << getStringFromU8string(str1) << '\t' << str1.length() << '\t' << str1.capacity() << std::endl;//  预留内存str1.reserve(100);std::cout << "str1.reserve()= " << getStringFromU8string(str1) << '\t' << str1.length() << '\t' << str1.capacity() << std::endl;// 释放多余内存str1.shrink_to_fit();std::cout << "str1.shrink_to_fit()= " << getStringFromU8string(str1) << '\t' << str1.length() << '\t' << str1.capacity() << std::endl;// 清空字符串str1.clear();std::cout << "str1.clear()= " << getStringFromU8string(str1) << '\t' << str1.length() << '\t' << str1.capacity() << std::endl;
}
3、短字符串优化(SSO)
编译器会自动优化短字符串,将内容存在栈中,通常在 15到23个字符 之间(在常见的64位系统上,许多实现为15个字符)
int main()
{system("chcp 65001");std::u8string str1 = u8"hello张三";std::cout << "str1.resize()= " << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;std::u8string str2 = u8"大多数实现对短字符串使用栈内存,避免堆分配";std::cout << "str2.resize()= " << getStringFromU8string(str2) << '\t' << "length=" << str2.length() << '\t' << "capacity=" << str2.capacity() << std::endl;
}
修改操作
| 操作方法 | 功能描述 | 示例 | 
|---|---|---|
| =赋值 | 字符串赋值 | str = "world"; | 
| +=操作符 | 字符串追加 | str += "!"; | 
| append() | 追加字符串 | str.append("123"); | 
| insert() | 在指定位置插入字符串 | str.insert(2, "abc"); | 
| erase() | 删除部分字符 | str.erase(2, 3); | 
| replace() | 替换部分字符 | str.replace(2, 3, "xyz"); | 
| clear() | 清空字符串内容 | str.clear(); | 
1、拼接操作
int main()
{system("chcp 65001");// = 赋值std::u8string str1 = u8"hello张三";std::cout << "str1.resize()= " << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// +=拼接str1 += u8"大多数实现对短字符串使用栈内存,避免堆分配";std::cout << "str1.resize()= " << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// append拼接str1.append(u8"world");str1.append(3, '#');str1.append(u8"abc", 5);str1.append(u8"defghijk", 3, 5);std::cout << "str1.resize()= " << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;
}
2、插入操作
int main()
{system("chcp 65001");// = 赋值std::u8string str1 = u8"hello张三";std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// 指定索引位置插入str1.insert(5, u8" World");std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// 指定迭代器位置插入str1.insert(str1.begin() + 1, '&');std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// 指定索引位置插入N个同样字符str1.insert(0, 3, '#');std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// 指定索引位置插入字符串变量str1.insert(2, str1);std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;
}
3、删除操作
int main()
{system("chcp 65001");// = 赋值std::u8string str1 = u8"hello张三world";std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// 从指定位置开始删除指定数量str1.erase(2, 2);std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// 删除指定迭代器位置的字符str1.erase(str1.begin() + 2);std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// 删除指定迭代器范围的字符str1.erase(str1.begin() + 1, str1.end() - 3);std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// 全部清空str1.clear();std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// 弹出最后一个字符str1.assign(u8"hello world");str1.pop_back();std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;
}
4、替换操作
int main()
{system("chcp 65001");// = 赋值std::u8string str1 = u8"hello张三world";std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// [指定位置,指定位置+N) 替换为新字符串str1.replace(2, 2, u8"ABC");std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// [迭代器位置,迭代器位置) 替换为新字符串str1.replace(str1.begin() + 1, str1.begin() + 2, u8"HeHe");std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// [指定位置,指定位置+N) 替换为N个同样字符str1.replace(0, 2, 3, '&');std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;
}
5、交换移动
int main()
{system("chcp 65001");// = 赋值std::u8string str1 = u8"hello张三";std::u8string str2 = u8"李四world";std::cout << "str1=" << getStringFromU8string(str1) << std::endl;std::cout << "str2=" << getStringFromU8string(str2) << std::endl;std::cout << "________________________________" << endl;// 交换内容str1.swap(str2);std::cout << "swap, str1=" << getStringFromU8string(str1) << std::endl;std::cout << "swap, str2=" << getStringFromU8string(str2) << std::endl;std::cout << "________________________________" << endl;// 交换内容std::swap(str1, str2);std::cout << "swap, str1=" << getStringFromU8string(str1) << std::endl;std::cout << "swap, str2=" << getStringFromU8string(str2) << std::endl;std::cout << "________________________________" << endl;// 移动std::u8string str3 = std::move(str1);std::cout << "swap, str1=" << getStringFromU8string(str1) << std::endl;std::cout << "swap, str3=" << getStringFromU8string(str3) << std::endl;std::cout << "________________________________" << endl;// 移动赋值std::u8string str4 = std::move(str2);std::cout << "swap, str2=" << getStringFromU8string(str2) << std::endl;std::cout << "swap, str4=" << getStringFromU8string(str4) << std::endl;
}
查找操作
int main()
{system("chcp 65001");// = 赋值std::u8string str1 = u8"hello张三world";std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// 从前往后查找auto pos1 = str1.find(u8"world");std::cout << getStringFromU8string(u8"位置-> ") << pos1 << endl;pos1 = str1.find('o');std::cout << getStringFromU8string(u8"位置-> ") << pos1 << endl;pos1 = str1.find(u8"o", 6);std::cout << getStringFromU8string(u8"位置-> ") << pos1 << endl;// 从后往前查找pos1 = str1.rfind(u8"hello");std::cout << getStringFromU8string(u8"位置-> ") << pos1 << endl;// 未找到返回 string::npospos1 = str1.find(u8"哈哈");if (pos1 == string::npos) {std::cout << "Not found -> " << pos1 << endl;}// 查找第一个匹配字符pos1 = str1.find_first_of(u8"l");std::cout << getStringFromU8string(u8"查找第一个匹配字符-> ") << pos1 << endl;// 查找最后一个匹配字符  pos1 = str1.find_last_of(u8"o");std::cout << getStringFromU8string(u8"查找最后一个匹配字符-> ") << pos1 << endl;// 查找第一个不匹配字符pos1 = str1.find_first_not_of(u8"ho");std::cout << getStringFromU8string(u8"查找第一个不匹配字符-> ") << pos1 << endl;// 查找最后一个不匹配字符pos1 = str1.find_last_not_of(u8"ro");std::cout << getStringFromU8string(u8"查找最后一个不匹配字符-> ") << pos1 << endl;// 是否以指定字符串开始bool match = str1.starts_with(u8"hello");std::cout << getStringFromU8string(u8"starts_with字符串-> ") << boolalpha << match << endl;match = str1.starts_with('H');std::cout << getStringFromU8string(u8"starts_with字符-> ") << boolalpha << match << endl;// 是否以指定字符串结束match = str1.ends_with(u8"world");std::cout << getStringFromU8string(u8"starts_with字符串-> ") << boolalpha << match << endl;match = str1.ends_with('d');std::cout << getStringFromU8string(u8"starts_with字符-> ") << boolalpha << match << endl;
}
截取操作
int main()
{system("chcp 65001");// = 赋值std::u8string str1 = u8"hello张三world";std::cout << getStringFromU8string(str1) << '\t' << "length=" << str1.length() << '\t' << "capacity=" << str1.capacity() << std::endl;// 截取字符串 [N,结束]auto sub1 = str1.substr(6);std::cout << getStringFromU8string(sub1) << '\t' << "length=" << sub1.length() << '\t' << "capacity=" << sub1.capacity() << std::endl;// 截取字符串 [N,N+5)sub1 = str1.substr(0, 5);std::cout << getStringFromU8string(sub1) << '\t' << "length=" << sub1.length() << '\t' << "capacity=" << sub1.capacity() << std::endl;// 截取字符串 [N,越界)sub1 = str1.substr(6, 1000);std::cout << getStringFromU8string(sub1) << '\t' << "length=" << sub1.length() << '\t' << "capacity=" << sub1.capacity() << std::endl;// 截取字符串 [越界,无穷大)try {sub1 = str1.substr(100);std::cout << getStringFromU8string(sub1) << '\t' << "length=" << sub1.length() << '\t' << "capacity=" << sub1.capacity() << std::endl;}catch (const std::out_of_range& e) {cout << getStringFromU8string(u8"越界了") << endl;}
}
比较操作
1、运算符比较
int main()
{system("chcp 65001");// = 赋值std::u8string str1 = u8"hello";std::u8string str2 = u8"world";std::cout << boolalpha << (str1 == str2) << endl;std::cout << boolalpha << (str1 != str2) << endl;std::cout << boolalpha << (str1 > str2) << endl;std::cout << boolalpha << (str1 >= str2) << endl;std::cout << boolalpha << (str1 < str2) << endl;std::cout << boolalpha << (str1 <= str2) << endl;
}
2、方法比较
int main()
{system("chcp 65001");// = 赋值std::u8string str1 = u8"hello";std::u8string str2 = u8"world";// 两个字符串比较std::cout << boolalpha << str1.compare(str2) << endl;// 分别截取子串比较std::cout << boolalpha << str1.compare(2, 3, str2, 3, 4) << endl;// 截取前面子串比较std::cout << boolalpha << str1.compare(2, 3, str2) << endl;
}
迭代器操作
中文
cout按字符默认输出到控制台有问题
int main()
{system("chcp 65001");// = 赋值std::string str1 = "hello&%world";// 正向迭代器for (auto it = str1.begin(); it != str1.end(); ++it) {std::cout << *it << " ";}std::cout << endl;std::cout << "------------------------------------" << endl;// 常量迭代器for (auto it = str1.cbegin(); it != str1.cend(); ++it) {std::cout << *it << " ";}std::cout << endl;std::cout << "------------------------------------" << endl;// 反向迭代器for (auto it = str1.rbegin(); it != str1.rend(); ++it) {std::cout << *it << " ";}std::cout << endl;std::cout << "------------------------------------" << endl;// 范围 for 循环for (char c : str1) {std::cout << c << " ";}std::cout << endl;std::cout << "------------------------------------" << endl;// const 范围 forfor (const char& c : str1) {std::cout << c << " ";}std::cout << endl;std::cout << "------------------------------------" << endl;
}
