将c ++ std :: vector <std :: string>转换为std :: vector <unsigned char =“”>(反之亦然)</unsigned> </std :: string>

时间:2012-02-22 05:40:00

标签: c++ string stl vector binary

是否有一种简单的方法可以将std::vector<std::string>转换为std::vector<unsigned char>(并再次转换回std::vector<std::string>,而无需手动转换每个字符串并添加分隔符,例如逗号?

4 个答案:

答案 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() );
}

charunsigned 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' );
    }
}
例如,

。)