【问题标题】:Replacing elements in vector using erase and insert使用擦除和插入替换向量中的元素
【发布时间】:2013-04-06 14:23:21
【问题描述】:
void replace(vector<string> my_vector_2, string old, string replacement){

    vector<string>::iterator it;
    for (it = my_vector_2.begin(); it != my_vector_2.end(); ++it){

        if (*it==old){
            my_vector_2.erase(it);
            my_vector_2.insert(it,replacement);

        }
    }

}

所以,我希望这个函数用字符串替换来替换向量中所有出现的旧字符串。但是当调用这个函数时,它根本不会改变向量。我不确定我是否正确使用了擦除和插入功能。有什么想法吗?

【问题讨论】:

  • 您不应该将向量作为reference 传递吗?
  • 天啊,我现在觉得自己好蠢……谢谢!
  • 您不需要擦除和插入。只需分配:*it = replacement;。这消除了有关迭代器失效的任何问题,并消除了一堆搅动以删除一个元素,然后在该元素曾经所在的位置打开一个插入孔。

标签: c++ vector insert iterator erase


【解决方案1】:

首先你需要通过引用而不是值来传递向量。

void replace(vector<string>& my_vector_2, string old, string replacement){

第二次擦除并插入invalidates它,你需要用擦除返回的新迭代器更新它

it = my_vector_2.erase(it);  
it = my_vector_2.insert(it,replacement);

【讨论】:

  • 这不是UB吗?在致电erase 后提及it 是UB,您在致电insert 时确实提及it。我认为您必须使用std::distance 的解决方法。
  • @Enn - 你没有注意到it 被分配了erase()结果?无效的迭代器无法使用,因为it 现在拥有一个有效的迭代器;以下insert() 行也是如此。
【解决方案2】:

您将 std::vector 作为值传递。为了更改您传递给函数的std::vector,请将其声明为引用

void replace(vector<string>& my_vector_2, string old, string replacement){ }

&amp; 表示您通过引用传递了您的std::vector,因此您可以访问您传递的对象。

并且不要删除元素,只需替换它。

【讨论】:

    【解决方案3】:

    有一个现成的algorithm 来解决你的问题:

    #include <algorithm>
    #include <string>
    #include <vector>
    
    std::vector<std::string> v;  // populate
    
    std::replace(v.begin(), v.end(), "old", "new");
    

    【讨论】:

    • 值得注意的是,这将T in replace 推导出为char[4]。混合stringconst char* 的操作应该是有效的,所以我认为在这种情况下它并不重要,但如果你想传入不同长度的字符串文字,那么你需要进行转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多