比较两个向量并从第二个向量中删除在第一个向量中找不到的元素-C ++

时间:2020-01-27 22:52:31

标签: c++ algorithm c++11 vector find

我有2个字符串向量:

vector < string > animals = {"cat", "dog", "pig", "tiger", "monkey", "lion"}
vector < string > someAnimals = {"dog", "mouse", "snake", "monkey", "cat"}

如何比较这两个向量,并删除一些在动物向量中找不到的动物矢量(“鼠标”和“蛇”)中的元素?

1 个答案:

答案 0 :(得分:0)

如果不允许对向量进行排序,则可以使用下面的演示程序中所示的以下方法。

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>

int main() 
{
    std::vector <std::string> animals = 
    {
        "cat", "dog", "pig", "tiger", "monkey", "lion"
    };

    std::vector <std::string> someAnimals = 
    {
        "dog", "mouse", "snake", "monkey", "cat"
    };

    auto not_present = [&animals]( const auto &s )
    {
        return 
        std::find( std::begin( animals ), std::end( animals ), s ) == std::end( animals );
    };

    someAnimals.erase( std::remove_if( std::begin( someAnimals ),
                                       std::end( someAnimals ),
                                       not_present ), std::end( someAnimals ) );

    for ( const auto &s : someAnimals )
    {
        std::cout << s << ' ';
    }
    std::cout << '\n';

    return 0;
}

程序输出为

dog monkey cat 

否则,可以将std::binary_search用于排序的向量,如下所示。

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>

int main() 
{
    std::vector <std::string> animals = 
    {
        "cat", "dog", "pig", "tiger", "monkey", "lion"
    };

    std::vector <std::string> someAnimals = 
    {
        "dog", "mouse", "snake", "monkey", "cat"
    };

    std::sort( std::begin( animals ), std::end( animals ) );
    std::sort( std::begin( someAnimals ), std::end( someAnimals ) );

    auto not_present = [&animals]( const auto &s )
    {
        return 
        not std::binary_search( std::begin( animals ), std::end( animals ), s );
    };

    someAnimals.erase( std::remove_if( std::begin( someAnimals ),
                                       std::end( someAnimals ),
                                       not_present ), std::end( someAnimals ) );

    for ( const auto &s : someAnimals )
    {
        std::cout << s << ' ';
    }
    std::cout << '\n';

    return 0;
}
相关问题