是否有一种简单的方法可以将std::vector<std::string>
转换为std::vector<unsigned char>
(并再次转换回std::vector<std::string>
,而无需手动转换每个字符串并添加分隔符,例如逗号?
答案 0 :(得分:1)
简短的回答是:不。
实现向量和字符串的方式是独立的堆分配数组。因此,在考虑内部时,您可以将vector<string>
转换为char**
(一个char的数组的锯齿状数组),将vector<unsigned char>
转换为char*
(一个char数组)。这会把你的问题变成:有没有办法连接数组而不必复制它们?
没有。不,没有。
答案 1 :(得分:0)
std::vector<char> chars;
for (const std::string& s : strings)
{
for (char c : s)
{
chars.push_back(c);
}
chars.push_back(',');
}
如果没有新的for循环语法,它会更加笨拙,但你明白了。
答案 2 :(得分:0)
Boost Serialization应该允许您将数据结构填充到unsigned char
序列中并重新构建它。
答案 3 :(得分:0)
第一个问题是为什么,你想做什么?什么是
std::vector<std::string>
表示,以及它的语义应该是什么
转换是?如果你只想连接,那么最简单
解决方案就像:
std::vector<unsigned char> results;
for ( std::vector<std::string>::const_iterator iter = source.begin();
iter != source.end();
++ iter ) {
results.insert( results.end(), iter->begin(), iter->end() );
}
char
到unsigned char
的隐式转换将会得到解决
reslt。
如果您需要为每个插入某种分隔符或终止符
在源代码中,您也可以在循环中执行此操作:对于a
终结者,只需在push_back
之后附加(insert
);为一个
分隔符,我通常在insert
之前有条件地附加它,
e.g:
std::vector<unsigned char> results;
for ( std::vector<std::string>::const_iterator iter = source.begin();
iter != source.end();
++ iter ) {
if ( iter != source.begin() ) {
results.push_back( separator );
}
results.insert( results.end(), iter->begin(), iter->end() );
}
但问题是:为什么unsigned char
?据推测,因为你是
格式化为某个特定协议的缓冲区。是一些额外的
需要格式化?协议中字符串的格式是什么?
(通常,它将是长度+数据,或'\0'
终止。)
协议是否需要某种对齐? (适用于XDR之一
最广泛使用的协议 - 你需要类似的东西:
std::vector<unsigned char> results;
for ( std::vector<std::string>::const_iterator iter = source.begin();
iter != source.end();
++ iter ) {
size_t len = iter->size();
results.push_back( (len >> 24) & 0xFF );
results.push_back( (len >> 16) & 0xFF );
results.push_back( (len >> 8) & 0xFF );
results.push_back( (len ) & 0xFF );
results.insert( results.end(), iter->begin(), iter->end() );
while ( results.size() % 4 != 0 ) {
results.push_back( '\0' );
}
}
例如,。)