1. 为什么需要关注C++字符串与容器的转换
在C++开发中,数据类型的转换是日常工作中最常见的操作之一。特别是std::string、char*和std::vector这三种类型,几乎出现在每个C++项目中。理解它们之间的高效转换方法,不仅能提升代码性能,还能避免许多潜在的内存问题和安全漏洞。
我见过太多项目因为不当的类型转换导致性能瓶颈甚至崩溃。有一次排查一个高频交易系统的性能问题,发现开发者在循环中反复进行string到char*的转换,导致大量不必要的内存分配和释放,最终拖慢了整个系统。这就是没有掌握高效转换技巧的典型后果。
2. std::string与char*的相互转换
2.1 从std::string到char*的转换
最直接的方法是使用c_str()和data()成员函数:
cpp复制std::string str = "Hello, World!";
const char* cstr1 = str.c_str(); // 保证以null结尾
const char* cstr2 = str.data(); // C++17前不保证null结尾,之后等同于c_str()
注意:c_str()返回的指针在string对象修改或销毁后就会失效。如果需要长期保存,应该复制数据:
cpp复制char* copy = new char[str.size() + 1];
std::strcpy(copy, str.c_str());
// 使用后记得delete[] copy;
2.2 从char*到std::string的转换
这个方向转换相对简单:
cpp复制const char* cstr = "Hello";
std::string str(cstr); // 直接构造
如果char数组可能包含null字符,应该使用接受长度参数的构造函数:
cpp复制char data[10] = {'H', 'e', '\0', 'l', 'o'};
std::string str(data, 5); // 包含所有5个字符,包括中间的null
