【问题标题】:Adding to middle of std::vector添加到 std::vector 的中间
【发布时间】:2011-06-15 14:26:23
【问题描述】:

有没有办法在 C++ 中将值添加到 vector 的中间?说我有:

vector <string> a;
// a gets filled up with "abcd", "wertyu", "dvcea", "eafdefef", "aeefr", etc

我想分解其中一根弦并将所有片段放回vector。我该怎么做?我断开的字符串可以在任何地方,index = 0,中间某处,或者 index = a.size() - 1

【问题讨论】:

    标签: c++ string vector


    【解决方案1】:

    您可以通过写入在i 位置插入vector

    v.insert(v.begin() + i, valueToInsert);
    

    但是,这不是很有效;它运行的时间与插入元素后的元素数量成正比。如果您打算拆分字符串并重新添加,最好使用 std::list,它支持 O(1) 的插入和删除。

    【讨论】:

    • 哦,好吧。我的向量很短,所以性能不是问题。然而。而且我认为出于某种原因我必须使用向量。我必须检查
    • 性能完全取决于相关数据量。与最多半兆左右的列表相比,我发现向量的性能非常好。
    • 非常长的 std::lists 性能很差,因为 CPU 无法进行缓存预取,并且每个链接都是间接指针查找。
    • 声明 std::list 有 O(1) 插入对我来说总是有点误导。假设您已经确切知道要插入的位置(并有一个指向它的指针),它的 O(1)。但是,如果您首先需要 find() 要插入的位置——找到它的 O(n),然后 然后 O(1) 插入,对吧?
    • 这不仅仅是数据量,还有复制/分配对象的复杂性。如果复制成本很高,那么列表可能会更好。
    【解决方案2】:

    你可以这样做,但是会很慢:

    int split = 3; // where to split
    a.insert(a.begin()+index, a[index].substr(0, split));
    a[index+1] = a[index+1].substr(split);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2015-10-03
      • 2020-01-26
      • 1970-01-01
      相关资源
      最近更新 更多