【问题标题】:Attaching char buffer to vector<char> in STL在 STL 中将 char 缓冲区附加到 vector<char>
【发布时间】:2009-09-09 13:23:48
【问题描述】:

将 C 缓冲区 (char *) 的内容附加到 std::vector&lt;char&gt; 末尾的正确(有效)方法是什么?

【问题讨论】:

    标签: c++ stl vector


    【解决方案1】:

    当您有可用的vector&lt;char&gt; 时,您可能最好调用vector&lt;char&gt;::insert 方法:

    std::vector<char> vec;
    
    const char* values="values";
    const char* end = values + strlen( values );
    
    vec.insert( vec.end(), values, end );
    

    将其委托给向量比使用back_inserter 更可取,因为向量可以决定其最终大小。 back_inserter 只会push_back,可能会导致更多的重新分配。

    【讨论】:

      【解决方案2】:

      我认为正确的方法是

      vec.insert(vec.end(),buf,buf+length);
      

      std::copy(buf,buf+length,std::back_inserter(vec));
      

      编辑:我重新排序了两个例子,所以不是评论者错了,只是我错了;-)

      【讨论】:

      • 虽然第一个也是正确的,但第二个更好,因为向量可以推断出迭代器是随机访问迭代器并使用它们预先保留,从而节省可能的重新分配。
      • 是的。不过,我对它的期望不高。无论如何,通往罗马的道路不止一条 ;-)
      • 我实际上希望第二个更好,因为许多现代实现现在优化了简单的情况。这在三个方面很简单:vector&lt;&gt; 是一个简单的模板,char* 是一个简单的迭代器,char 是一个简单的 POD。
      • 我会根据大众的需求对它们进行重新排序,但我想说的主要一点是,拥有不止一种方式是件好事。感谢 MSalters 和 sbi 的 cmets。
      【解决方案3】:

      我还没有编译,但应该是这样的:

      const char string1[] = "a string";
      std::vector<char> vData;
      vData.insert(vData.end(), string1, string1+strlen(string1));
      

      【讨论】:

        猜你喜欢
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        • 2012-07-05
        • 2012-05-27
        • 2012-10-08
        • 1970-01-01
        • 1970-01-01
        • 2016-08-19
        相关资源
        最近更新 更多