我有这个载体:
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;
}
效率这么高吗?
答案 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))而不是线性时间内完成。
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))
)。