我想将一个向量(vectorAlpha)附加到另一个向量(vectorBeta)的末尾.我能想到两种不同的方法,我想知道如何做每一种方法.
第一种方法是附加第二个向量并从新向量中删除所有重复项.另一种方法是单独在单个向量中留下重复项,但如果它们已经存在于vectorALpha中,则不会添加来自vectorBeta的任何项.
例如,如果向量是具有以下值的向量:
vectorAlpha:
First line of alpha An alpha line An alpha line Some line Alpha fifth line
vectorBeta:
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
虽然第二种方法只是两个数组合并,但第二个向量中的’Some 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
这两个appraoches使用的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()).完整代码is compiling on codepad.org
干杯
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。