此常见问题解答涉及聚合和POD,并涵盖以下材料:
我很想知道如何实现std :: string以及它与c字符串的区别?如果标准没有指定任何实现,那么任何带有解释的实现都会很好,它如何满足标准给出的字符串要求?
我知道在C++ 03中,从技术上讲,std::basic_string模板不需要具有连续的内存.但是,我很好奇有多少实现存在于实际利用这种自由的现代编译器.例如,如果想要用来basic_string接收某些C API的结果(如下面的例子),分配一个向量只是为了立即将它变成一个字符串似乎很愚蠢.
例:
DWORD valueLength = 0;
DWORD type;
LONG errorCheck = RegQueryValueExW(
hWin32,
value.c_str(),
NULL,
&type,
NULL,
&valueLength);
if (errorCheck != ERROR_SUCCESS)
WindowsApiException::Throw(errorCheck);
else if (valueLength == 0)
return std::wstring();
std::wstring buffer;
do
{
buffer.resize(valueLength/sizeof(wchar_t));
errorCheck = RegQueryValueExW(
hWin32,
value.c_str(),
NULL,
&type,
&buffer[0],
&valueLength);
} while (errorCheck == ERROR_MORE_DATA);
if (errorCheck != ERROR_SUCCESS)
WindowsApiException::Throw(errorCheck);
return buffer;
Run Code Online (Sandbox Code Playgroud)
我知道像这样的代码可能会略微降低可移植性,因为它意味着它std::wstring是连续的 - 但我想知道这个代码是多么不可移植.换句话说,编译器如何实际利用具有非连续内存的自由?
编辑:我更新了这个问题,提到C++ 03.读者应注意,在定位C++ 11时,标准现在要求basic_string是连续的,因此在定位该标准时,上述问题不是问题.
在std :: string中,只有const成员来获取数据,如c_str().但是我可以获得对字符串via的第一个元素的引用operator[],我可以写入它.
例如,如果我有功能:
void toupper(char *first,char *last_plus_one);
Run Code Online (Sandbox Code Playgroud)
我可以直接写向量获取指向第一个元素的指针:
vector<char> message // has "Some Message";
toupper(&message[0],&message[0]+message.size());
Run Code Online (Sandbox Code Playgroud)
我可以用std :: string做同样的事情吗?
string message="Some Message";
toupper(&message[0],&message[0]+message.size());
Run Code Online (Sandbox Code Playgroud)
标准是否保证内存的位置实际上是线性的?即:
&(*(message.begin()+n)) == &message[n]
Run Code Online (Sandbox Code Playgroud)
谢谢.
如果我需要在一个需要确保没有分配任何内容的情况下从一个NUL终止的char阵列中获取std::string,那么使用它是否安全c_str?例如,如果我在析构函数中并且我想将一些数据从一个复制string到预先分配的固定大小的缓冲区中,我可以使用c_str并确保它不会抛出任何东西吗?