C++ - 将一个向量附加到另一个向量,并删除重复项
C++ - Appending one Vector to another, with removal of duplicates?
我想将一个向量(vectorAlpha)附加到另一个向量(vectorBeta)的末尾。我能想到两种不同的方法,我想知道如何做每种方法。
第一种方法是附加第二个向量并从新向量中删除所有重复项。另一种方法是在单个向量中保留重复项,但如果它们已经存在于vectorALpha中,则不从vectorBeta添加任何项目。
例如,如果向量是具有以下值的向量:
矢量阿尔法:
First line of alpha
An alpha line
An alpha line
Some line
Alpha fifth line
矢量测试版:
Beta first line
A beta line
A beta line
Some line
Beta fifth line
我认为第一种方法将导致组合向量:
First line of alpha
An alpha line
Some line
Alpha fifth line
Beta first line
A beta line
Beta fifth line
虽然第二种方法只是将两个数组组合在一起,但未添加第二个向量的"某行":
First line of alpha
An alpha line
An alpha line
Some line
Alpha fifth line
Beta first line
A beta line
A beta line
Beta fifth line
用于这两个应用C++代码是什么?
因为很明显
- 您只希望重复项从 vecB 中删除条目(如果它们存在于 vecA 中),而不是一般的重复项
- 您想要保留订单
答案应该是(显然?)是std::remove_copy_if。这样称呼它:
#include <vector>
#include <algorithm>
typedef std::vector<int> Vec;
struct Contained
{
const Vec& _sequence;
Contained(const Vec &vec) : _sequence(vec) {}
bool operator()(int i) const
{
return _sequence.end() != std::find(_sequence.begin(), _sequence.end(), i);
}
};
int main()
{
Vec vecA;
Vec vecB;
std::remove_copy_if(vecB.begin(), vecB.end(), back_inserter(vecA), Contained(vecA));
}
您可能希望根据 vecA 的大小和性质优化谓词:
#include <set>
template <typename T>
struct Contained
{
const std::set<T> _set;
template <typename It> Contained(const It& begin, const It& end) : _set(begin, end) {}
bool operator()(const T& i) const
{
return _set.end() != _set.find(i);
}
};
这将用作Contained<int>(vecA.begin(), vecA.end())
.完整代码正在编译 codepad.org
干杯
更新:由于更改/添加的要求,此处的新答案
typedef std::...<...> Vec;
Vec vecA;
Vec vecB;
// fill your data
// sort
std::sort(vecA.begin(), vecA.end());
std::sort(vecB.begin(), vecB.end());
// join
size_t mergesize = vecA.size();
std::copy(vecB.begin(), vecB.end(), std::back_inserter(vecA));
// merge
std::inplace_merge(vecA.begin(), vecA.begin()+mergesize, vecA.end());
您可以按如下方式组合加入+合并步骤
Vec vecC;
std::merge(vecA.begin(), vecA.end(),
vecB.begin(), vecB.end(),
std::back_insterter(vecC));
最后一步,删除重复项:
Vec::iterator pte = std::unique(vecC.begin(), vecC.end());
// dups now in [pte, vecC.end()), so optionally erase:
vecC.erase(pte, vecC.end());
两个向量中元素的顺序重要吗?如果没有,那么您可能应该改用集合。
相关文章:
- C++从另一个类访问公共静态向量的正确方法是什么
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 将一个向量插入另一个向量的某个位置
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 使用 std::transform 将向量向量 (a) 添加到另一个向量向量 (b)
- 如何按另一个向量的方向调整一个向量?
- 将字符向量复制到另一个向量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 如何避免将向量的完整值复制到另一个容器
- 如何将所有指针从一个向量移动到另一个向量?
- 如何从另一个向量中的另一个第一元素减去向量中的第一元素
- 用一个向量替换另一个向量的方法
- 如何根据另一个向量中给出的索引拆分向量?
- 如何在另一个类中调用类型类的向量?
- 按另一个向量对一个向量进行排序
- 具有多线程支持的 RenderClass,将函数调用推送到向量以在另一个线程上调用
- 如何设置一个 std::vector 与另一个,其中两个是不同类的向量?