在他的网站2008年的一篇文章中,Herb Sutter声明如下:
由于与并发相关的原因,有一个积极的建议是在C++ 0x中进一步加强这一点并且需要空终止并且可能禁止写时复制实现.以下是该文件:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2534.html.我认为本文中的一个或两个提案很可能会被采纳,但我们将在下一个或两个会议上看到.
我知道C++ 11现在保证std :: string内容连续存储,但他们是否在最终草案中采用了上述内容?
现在使用类似的东西会安全&str[0]吗?
协议缓冲区说它可以包含任意字节序列.但如果我的数据包含'\ 0',协议缓冲区如何从字符串变量编码我的整个数据.
我想读取一个二进制文件,并使用类似的东西std::string自动调整缓冲区大小等.
我正在使用Visual C++.我有什么选择?
该cppreference页说,有关std::basic_string::swap它具有恒定的复杂性.我认为这意味着不能发生复制内容,只能交换指针或类似内容.我写了一个测试代码并且经历过它确实在VS2010下移动了内容.测试代码:
std::string s1("almafa");
std::string s2("kortefa");
std::cout << "s1.c_str(): "<< (void*)s1.c_str() << std::endl;
std::cout << "s2.c_str(): "<< (void*)s2.c_str() << std::endl;
std::cout << "SWAP!" << std::endl;
s1.swap(s2);
std::cout << "s1.c_str(): "<< (void*)s1.c_str() << std::endl;
std::cout << "s2.c_str(): "<< (void*)s2.c_str() << std::endl;
Run Code Online (Sandbox Code Playgroud)
g ++ 4.6.3上的输出
s1.c_str(): 0x22fe028
s2.c_str(): 0x22fe058
SWAP!
s1.c_str(): 0x22fe058
s2.c_str(): 0x22fe028
Run Code Online (Sandbox Code Playgroud)
VS2010的输出
s1.c_str(): 000000000022E2D0
s2.c_str(): 000000000022E320
SWAP!
s1.c_str(): 000000000022E2D0
s2.c_str(): 000000000022E320
Run Code Online (Sandbox Code Playgroud)
它是标准的分歧还是我不知道的事情发生了?
我来自C背景,在学习C++时我遇到了<string>头文件.在C字符串中,将是一个以字符结尾的字符数组'\0'.
但是,在std::string我发现情况并非如此,并且在任何有效索引处插入/替换空字符时,不会像我期望的那样修剪字符串.
string s;
getline(cin, s);
// remove all punctuation
for(string::size_type i = 0, n = s.size(); i < n; i++)
{
if(ispunct(s[i]))
s[i] = '\0';
}
Run Code Online (Sandbox Code Playgroud)
输入:你好,世界!!!!
输出:Hello World
预期产量:你好
在观察上述行为时,我假设C++中的字符串不是空终止的.然后我发现这个问题在字符串中使用空字符(C++)这让我感到困惑.
string s = "Hello\0, World";
cout << s << endl;
Run Code Online (Sandbox Code Playgroud)
输出:你好
预期产量:你好,世界
如果有人能解释这种行为背后的原因,将会有所帮助.