微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我想将一个向量(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 举报,一经查实,本站将立刻删除。

相关推荐