C++从两个向量中删除重复元素
C++ remove duplicate elements from two vectors
我有两个向量,std::vector<double> xvec
和std::vector<double> yvec
,每个向量都有数百万个相同大小的元素。但是xvec[i]和yvec[i]的组合用于定义唯一对象。例如
xvec = {1.0,2.0,2.0,3.0,2.0}
yvec = {5.0,1.0,1.5,2.0,1.0}
那么2.0_1.0组合就是重复元素,它应该从x和y向量中删除。
我希望在删除重复元素后返回xvec和yvec。按照示例,返回的xvec和yvec应该是
xvec = {1.0,2.0,2.0,3.0}
yvec = {5.0,1.0,1.5,2.0}
我知道如何使用排序和唯一函数对单个向量执行这样的任务。但有人能给我一些完成这个算法的想法吗?
我认为有三种可能性:
解决方案1
针对给定的问题,自己执行std::sort
和std::unique
。std::unique
很容易实现,但我现在不想实现排序算法。所以我不会给你举一个例子。
解决方案2
实现您自己的RandomAccessIterator
和ForwardIterator
,并使用std::sort
和std::unique
。
解决方案3
遍历这些值,并使用std::set
或std::unordered_set
检查当前值是否已经存在。
std::vector<double> xvec = {...};
std::vector<double> yvec = {...};
std::set<std::tuple<double,double> > set;
for (std::size_t i = 0; i < xvec.size();) {
if (set.emplace(xvec[i], yvec[i]).second) {
i++;
} else {
xvec.erase(xvec.begin() + i);
yvec.erase(yvec.begin() + i);
}
}
您可以将xvec
和yvec
存储为成对的向量,即std::vector<std::pair<double,double> > vec
。这将允许您轻松地使用std::sort
和std::unique
来实现您所描述的内容。我在下面包含了一些代码来演示这一点。
注意:下面的代码有点冗长,但将通过在重复数据消除之前和之后打印每个元素来演示一个有效的解决方案。代码应使用标志--std=c++11
进行编译
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
// Vector of pairs with duplicates.
std::vector<std::pair<double,double> > vec = {{1,1},{1,3},{1,1},{2,4},{5,1}};
std::cout << "Before:n";
// Prints x - values
std::cout << "x:";
for (auto i : vec)
{
std::cout << i.first << "t";
}
std::cout << "ny:";
// Prints y - values
for (auto i : vec)
{
std::cout << i.second << "t";
}
std::cout << "nAfter:n";
// The magic happens here :)
std::sort(vec.begin(),vec.end());
auto last = std::unique(vec.begin(), vec.end());
vec.erase(last, vec.end());
std::cout << "x:";
// Prints x - values
for (auto i : vec)
{
std::cout << i.first << "t";
}
std::cout << "ny:";
// Prints y - values
for (auto i : vec)
{
std::cout << i.second << "t";
}
return 0;
}
相关文章:
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 从矢量中删除元素后出现隔离错误
- 如何使用remove_if从矢量中删除元素
- 如何从使用 for 循环中的矢量大小的矢量中删除元素
- C++映射不删除元素
- 如何从标准::元组中删除元素?
- 在动态数组中添加/删除C++元素
- 如何通过比较彼此的成员从QStringList中删除元素
- 如何修复从矢量中删除元素的错误?
- 从 std::set 中删除元素,同时在 C++17 中迭代该元素
- 使用remove_if从矢量中删除元素
- 用C++从三维矢量中删除元素
- 从对象数组中删除元素
- 如何在不使用 vector::erase() 的情况下编写自定义 Vector 方法来删除元素?
- C++ - 按自定义数据类型向量的值删除元素
- 从任意容器中廉价删除元素的惯用方法?
- 从数组中删除元素不起作用的函数
- 删除元素 BST
- 从向量中删除元素时未处理的异常