C++ ostringstream到vector<;uint8_t>;

C++ ostringstream到vector<;uint8_t>;,c++,visual-studio-2010,C++,Visual Studio 2010,我有一个奇怪的错误:我想将ostringstream的内容复制到未签名字符的vecotr中: vector缓冲区; ostringstream os; 操作系统 返回一个新的临时字符串,其中包含os的内容。将迭代器带到它的开头 os.str().end() 返回另一个包含os内容的临时字符串。将迭代器带到它的末尾 这两个迭代器无效,因为临时字符串现在已超出范围。此外,迭代器也不属于同一序列(此处为字符串) 您所做的几乎(甚至不考虑悬而未决的迭代器)等同于 string str1 = os.s

我有一个奇怪的错误:我想将ostringstream的内容复制到未签名字符的vecotr中:

vector缓冲区;
ostringstream os;
操作系统
返回一个新的临时字符串,其中包含
os
的内容。将迭代器带到它的开头

os.str().end()
返回另一个包含
os
内容的临时字符串。将迭代器带到它的末尾

这两个迭代器无效,因为临时字符串现在已超出范围。此外,迭代器也不属于同一序列(此处为字符串)

您所做的几乎(甚至不考虑悬而未决的迭代器)等同于

string str1 = os.str();
string str2 = os.str();

buffer.insert( buffer.end(), str1.begin(), str2.end() );
返回一个新的临时字符串,其中包含
os
的内容。将迭代器带到它的开头

os.str().end()
返回另一个包含
os
内容的临时字符串。将迭代器带到它的末尾

这两个迭代器无效,因为临时字符串现在已超出范围。此外,迭代器也不属于同一序列(此处为字符串)

您所做的几乎(甚至不考虑悬而未决的迭代器)等同于

string str1 = os.str();
string str2 = os.str();

buffer.insert( buffer.end(), str1.begin(), str2.end() );
ostringstream::str()
返回基础缓冲区的副本

在案例1和案例2中,调用
str()
两次(一次用于
begin()
,一次用于
end()
),因此每个生成的迭代器都与缓冲区的不同副本相关。此外,这些字符串是临时字符串,因此它们立即超出范围,使迭代器“悬空”。

ostringstream::str()
返回底层缓冲区的副本


在案例1和案例2中,调用
str()
两次(一次用于
begin()
,一次用于
end()
),因此每个生成的迭代器都与缓冲区的不同副本相关。此外,这些字符串是临时字符串,因此它们立即超出范围,使迭代器“悬空”。

这是正确的:const string&str=os.str();insert(buffer.end(),str().begin(),str().end());是的,这是有效的。
os.str()
返回的临时文件的生存期将延长到
str
的生存期。现在,您正在从同一序列中复制迭代器,这样应该可以了;insert(buffer.end(),str().begin(),str().end());是的,这是有效的。
os.str()
返回的临时文件的生存期将延长到
str
的生存期。现在,您正在从同一序列中复制迭代器,因此这应该没问题。如果您想要
无符号字符
,为什么代码要使用
uint8\t
?它们不一样。它们是一样的,在“不,它们不一样”下定义<没有8位无符号类型的平台上不存在代码>uint8_t
<代码>无符号字符存在于所有平台上。它们不一定相同。对于大多数编译器,它们都是。如果它们不相同,您可以执行
void f(uint8_t){}void f(unsigned char){}
,但这可能是不可能的。如果您想要
unsigned char
,为什么代码使用
uint8_t
?它们不一样。它们是一样的,在“不,它们不一样”下定义<没有8位无符号类型的平台上不存在代码>uint8_t<代码>无符号字符存在于所有平台上。它们不一定相同。对于大多数编译器,它们都是。如果它们不相同,您可以执行
void f(uint8_t){}void f(unsigned char){}
,但这可能是不可能的。
string str1 = os.str();
string str2 = os.str();

buffer.insert( buffer.end(), str1.begin(), str2.end() );