我可以看到几乎所有的现代API都是用C语言开发的。原因有:处理速度,低级语言,跨平台等。
如今,我在C ++中编程因为它的面向对象,使用字符串,STL但主要是因为它是一个更好的C。
然而,当我的C ++程序需要与C API交互时,当我需要将char []类型转换为C ++字符串,然后使用其强大的方法对这些字符串进行操作,最后将这些字符串转换为char时,我真的很烦恼]再次(因为API需要接收char [])。
如果我为数百万条记录重复这些操作,则由于转换任务,处理时间会更长。 出于这个简单的原因,我觉得char []是将C ++视为更好的c的当下障碍。
我想知道你是否有同感,如果没有(我希望如此!)我真的想知道哪个是C ++与char []类型共存的最佳方式,而不进行那些可怕的转换。 谢谢你的关注。
答案 0 :(得分:4)
C ++字符串类有很多问题,是的,你所描述的是其中之一。
更具体地说,如果没有创建字符串的 copy ,就无法进行字符串处理,这可能很昂贵。
因为几乎所有字符串处理算法都是作为类成员实现的,所以它们只能在字符串类上使用
。您可能想要尝试的解决方案是Boost.Range和Boost.StringAlgo的组合。
Range允许您从一对迭代器中创建序列。他们不接受数据的所有权,因此他们不会复制字符串。他们只是指向你的char *字符串的开头和结尾。
Boost.StringAlgo将所有常见的字符串操作实现为非成员函数,可以应用于任何字符序列。例如,Boost范围。
这两个库的组合几乎解决了这个问题。它们可以让您避免复制字符串来处理它们。
另一种解决方案可能是将您的字符串数据始终存储为std::string
的 。当您需要将char*
传递给某个API functoin时,只需将第一个字符的地址传递给它即可。 (安培; STR [0])。
第二种方法的问题是std :: string不保证其字符串缓冲区以空值终止,因此您要么必须依赖于实现细节,要么手动添加空字节作为的一部分字符串。
答案 1 :(得分:3)
如果使用std::vector<char>
而不是std::string
,则基础存储将是可以使用&someVec[0]
访问的C数组。但是,您确实失去了很多std::string
便利,例如operator+
。
那就是说,我建议尽量避免使用C语言尽可能地改变字符串。如果需要将不可变字符串传递给C函数,可以使用c_str()
,这在大多数std::string
实现中都是快速且非复制的。
答案 2 :(得分:1)
我不确定“转化”是什么意思,但在char*
,char[]
和std::string
之间移动不足以满足以下条件吗?
char[] charString = {'a', 'b', 'c', '\0'};
std::string standardString(&charString[0]);
const char* stringPointer(standardString.c_str());
答案 3 :(得分:0)
我认为这并不像你做到的那样糟糕。
将char []转换为std :: string的成本,但是如果您要修改字符串,无论是转换为std :: string还是复制到另一个字符串,都必须支付该成本。 char [] buffer。
转向另一种方式(通过string.c_str())通常是微不足道的。它通常返回一个指向内部缓冲区的指针(只是不要将该缓冲区提供给将修改它的代码)。
答案 4 :(得分:0)
我不确定为什么你会被限制使用C字符串并且仍然有一个运行C ++代码的环境但如果你真的不想要转换的开销,那么就不要转换。只需编写对C字符串进行操作的例程。
转换为C ++样式字符串的另一个原因是绑定安全性。
答案 5 :(得分:-5)
“......因为它是一个更好的C。”
胡扯。 C ++是一种非常低劣的C方言。它所解决的问题是微不足道的,它带来的问题,比它解决的问题要糟糕得多。