【问题标题】:converting a c++ std::vector<std::string> to std::vector<unsigned char> (and vice versa)将 c++ std::vector<std::string> 转换为 std::vector<unsigned char> (反之亦然)
【发布时间】:2012-02-22 05:39:59
【问题描述】:

有没有一种简单的方法可以将std::vector&lt;std::string&gt; 转换为std::vector&lt;unsigned char&gt;(然后再转换回std::vector&lt;std::string&gt;,而无需手动转换每个字符串并添加分隔符,例如逗号?

【问题讨论】:

  • 你能举个例子吗?
  • 请澄清您的问题。前者是字符串序列,后者是单个字符序列。我想你将需要某种分隔符。在了解我们如何需要了解您想要做什么之前。举个例子会有很大帮助。
  • 基本上,如果我想将 std::string 转换为 std::vector,我可以使用 std::vector&lt;unsigned char&gt; char_vec(myString.begin(), myString.end()) 之类的东西,对吧?我想知道是否有一种简单的方法可以以类似的方式从 std::vector<:string> 转换为 std::vector`。
  • 所以你真的不是说std::vector&lt;std::vector&lt;unsigned char&gt; &gt;
  • 这个问题确实需要澄清。字符串包装了一个字符数组,一个字符向量包装了一个字符数组,因此可以进行转换。但是字符串向量充当二维字符数组,字符向量是一维数组;你怎么可能将一个“转换”为另一个?

标签: c++ string stl vector binary


【解决方案1】:

简短的回答是:不。

向量和字符串的实现方式是独立的、堆分配的数组。因此,在考虑内部结构时,您可以将vector&lt;string&gt; 转换为char**(char 数组的锯齿状数组),并将vector&lt;unsigned char&gt; 转换为char*(char 数组)。这将您的问题变成:有什么方法可以连接数组而不必复制它们?

没有。不,没有。

【讨论】:

    【解决方案2】:
    std::vector<char> chars;
    for (const std::string& s : strings)
    {
        for (char c : s)
        {
            chars.push_back(c);
        }
        chars.push_back(',');
    }
    

    没有新的 for 循环语法会有点笨拙,但你明白了。

    【讨论】:

    • C++ 有迭代器!你可以写chars.insert(chars.end(), s.begin(), s.end());
    【解决方案3】:

    Boost Serialization 应该让您将数据结构填充到unsigned char 的序列中,然后重新构造它。

    【讨论】:

      【解决方案4】:

      第一个问题是为什么,你想做什么?什么是 std::vector&lt;std::string&gt;代表,语义应该是什么 转换是?如果你只想连接,那么最简单的 解决方案类似于:

      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 的隐式转换将处理 结果。

      如果您需要为每个字符插入某种分隔符或终止符 源中的字符串,您也可以在循环中执行此操作:对于 终止符,只需将它 (push_back) 附加到 insert 之后;为一个 分隔符,我一般在insert之前有条件地附加它, 例如:

      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' );
          }
      }
      

      ,例如。)

      【讨论】:

        猜你喜欢
        • 2012-03-07
        • 1970-01-01
        • 2012-05-13
        • 2021-07-11
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多