o字符串流到矢量<uint8_t>
ostringstream to vector<uint8_t>
我有一个奇怪的错误:我想将ostringstream的内容复制到一个未签名字符的向量中:
vector< uint8_t > buffer;
ostringstream os;
os << num1 << char1 << num2 << char2;
// 1. this will crash
buffer.insert( buffer.end(), os.str().begin(), os.str().end() );
// 2. this also crash
copy( os.str().begin(), os.str().end(), back_inserter( buffer );
string str = os.str();
// 4. this work
buffer.insert( buffer.end(), str().begin(), str().end() );
// 5. this also works
copy( str().begin(), tr().end(), back_inserter( buffer );
我不明白为什么1和2在visualstudio2010上崩溃。
有人有什么建议吗?
编辑
解决方案是:
vector< uint8_t > buffer;
ostringstream os;
os << num1 << char1 << num2 << char2;
const string& str = os.str();
// 4. this work
buffer.insert( buffer.end(), str().begin(), str().end() );
os.str().begin()
返回一个新的临时字符串,其中包含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()
(,因此每个生成的迭代器都与缓冲区的不同副本相关。此外,这些字符串是临时字符串,因此它们立即超出范围,使迭代器"悬空"。
相关文章:
- EASTL矢量<向量<int>>连续的
- 从值小于256的uint16到uint8的Endian安全转换
- 你能把一个向量<int64>投射到一个向量<uint8>吗
- SSCANF 进入 uint8 阵列失败
- 着色器将uint8投射到float,并将其重新解释回uint
- 将指针uint8覆盖到指针uint16
- 创建一个包含30亿个uint8元素的向量
- 将 Uint8(浮点AUDIO_F32)转换为int16_t(16 位 PCM)
- UINT8/16 /32/etc 和 INT8/16/32/etc 在 libtiff 中不起作用?
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 将具有不同字段的结构转换为 uint8 的数组
- uint32, int16, uint8 .为什么这些常用的数据类型没有进入标准
- C 字符串比较“祝您好运”&gt;“再见”
- 如何将 uint8 列表转换为其相应的有符号值
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 兼容的声明 __attribute__ ((节( ".abc.dfe" ))) 常量易失性 uint8 属性变量 = 0;- 符合MISRA标准
- 如何将UINT8*施放到UINT32
- 如何将元素从 Swift 中的 [UnsafeMutablePointer<UInt8>] 转换为 C++ 中的 UInt8 *
- 从字符串转换为 uint8,反之亦然