从 2 个不同的向量中删除匹配的元素 [复制]

Remove matched elements from 2 different vectors [duplicate]

提问人:Farah 提问时间:11/2/2023 更新时间:11/2/2023 访问量:73

问:

如何在保持相同顺序的同时删除 c++ 中的匹配元素? 我在这里发现了类似的问题,但是当我想保持顺序时,他们会对元素进行排序 例如,我有 v1{1,2,3,4} , v2{8,6,2,4,3} ,结果应为 {1},{8,6}。

这是我的代码

#include <iostream>
#include<vector>
using namespace std;
int main() {
vector<int> v1{1,2,3,4},v2{8,2,4,3};

  for (auto i=0;i<v1.size();i++){
      for (auto j=0;j<v2.size();j++){
          if (v1[i]==v2[j])
          {
              v1.erase(v1.begin()+i);
              v2.erase(v2.begin()+j);
          }
           
         }
  }
    return 0;
}

但它给出了错误的结果,那么我该如何完成呢?

C++ 向量 减法

评论

0赞 463035818_is_not_an_ai 11/2/2023
去除元素不会改变剩余元素的顺序,因此问题尚不清楚
3赞 Some programmer dude 11/2/2023
当前代码会跳过元素。如果你坐下来想一想,也许用笔和纸来帮忙,我相信你会弄清楚发生了什么以及为什么。
0赞 463035818_is_not_an_ai 11/2/2023
什么是错误的结果?您应该在问题中包括输出和预期输出。此代码没有输出。你使用过调试器吗?请在问题中提及。
1赞 Some programmer dude 11/2/2023
至于解决问题的简单方法,我建议您使用迭代器进行迭代并使用擦除返回的内容
0赞 pptaszni 11/2/2023
stackoverflow.com/a/8628963/4165552 - 像这样,但在你的情况下会有 2 个嵌套循环

答:

0赞 Pepijn Kramer 11/2/2023 #1

如果你能避免原始循环,像这样

#include <algorithm>
#include <iostream>
#include <vector>

int main() 
{

    std::vector<int> v1{1, 2, 3, 4}, v2{ 8,2,4,3,6 };

    auto it1 = std::remove_if(v1.begin(), v1.end(), [&](const int value) { return (std::find(v2.begin(), v2.end(), value) != v2.end()); });
    // don't erase just yet (elements to be deleted will be moved to end, the rest should have preserved their order)
    auto it2 = std::remove_if(v2.begin(), v2.end(), [&](const int value) { return (std::find(v1.begin(), v1.end(), value) != v1.end()); });

    v1.erase(it1, v1.end());
    v2.erase(it2, v2.end());

    for (const int value : v1) std::cout << value << " ";
    std::cout << "\n";
    for (const int value : v2) std::cout << value << " ";
    std::cout << "\n";

    return 0;
}