加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C – 将一个Vector附加到另一个,删除重复项?

发布时间:2020-12-16 10:18:44 所属栏目:百科 来源:网络整理
导读:我想将一个向量(vectorAlpha)附加到另一个向量(vectorBeta)的末尾.我能想到两种不同的方法,我想知道如何做每一种方法. 第一种方法是附加第二个向量并从新向量中删除所有重复项.另一种方法是单独在单个向量中留下重复项,但如果它们已经存在于vectorALpha中,则
我想将一个向量(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

干杯

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读