查找向量是否包含第二个元素等于X的对

时间:2014-04-19 19:32:10

标签: c++ algorithm c++11 search coding-efficiency

我有这个载体:

using namespace std;

vector< pair<short, string> > vec = {};

我想知道是否与<a, b>存在一对b == X

我从std::find了解<algorithm>,但不知道如何在此处应用。

我应该编写自己的函数吗?

bool is_in_vec(X)
{
    for (auto& e : vec)
        if (e.second == X)
            return true;
    return false;
}

效率这么高吗?

4 个答案:

答案 0 :(得分:9)

如果您只想知道是否存在满足您的标准的元素,那么您的解决方案看起来很好。我会在循环中使用const引用,因为循环不应该更改向量的元素:

for (const auto& e : vec) ....

如果您想使用标准库算法,可以尝试std::find_if

const std::string X{"foobar"};

auto it = std::find_if(vec.begin(), 
                       vec.end(), 
                      [&X](const pair<short, string>& p)
                      { return p.second == X; });

这里,it是满足条件的第一个元素的迭代器,如果没有找到元素,则等于vec.end()

答案 1 :(得分:3)

事实上,如果您可以根据vector字段对second对进行排序,那么您可以吃蛋糕并吃掉它。

在这种情况下,您最终会重新发明Boost调用flat_(multi_)map的内容。显而易见的好处是搜索可以在O(log(n))而不是线性时间内完成。

查看 Live On Coliru

using namespace std;

#include <utility>
#include <vector>
#include <string>
#include <algorithm>

typedef std::pair<short, std::string> Pair;

struct Cmp 
{
    bool operator()(Pair const& a, Pair const& b) const { return a.second < b.second; };
    bool operator()(Pair const& a, std::string const& b) const { return a.second < b; };
    bool operator()(std::string const& a, Pair const& b) const { return a < b.second; };
};

int main()
{
    std::vector<Pair> vec = { 
        { 1, "aap" }, 
        { 2, "zus" }, 
        { 3, "broer" }
    };

    Cmp cmp;
    std::sort(vec.begin(), vec.end(), cmp);

    auto it = std::binary_search(vec.begin(), vec.end(), std::string("zus"), cmp);

    std::cout << it->first << ": " << it->second << "\n";
}

打印

2: zus
42: zus

答案 2 :(得分:2)

在C ++ 11中,您也可以使用std::any_of

std::string X{"foobar"};
return std::any_of(vec.begin(), vec.end(),
                   [&X](const pair<short, string>& p)
                   { return p.second == X; });

答案 3 :(得分:1)

我认为您应该使用std::map代替,这将提供一个非常有效的std::map::find成员函数:

std::map<std::string, short>
// …
auto it = map.find(X);

这与此类查找一样高效(保证为O(log(N)))。