gpt4 book ai didi

c++ - std::find_if 、 std::binary_function 用于按值搜索 std::map

转载 作者:行者123 更新时间:2023-11-30 04:09:26 26 4
gpt4 key购买 nike

我的 std::map 有一对“唯一键”和“唯一值”。我通常会为一个值找到一个键,并为一个键找到一个值。我已经知道使用 std::find_if + lambda 的方法,但是我想知道是否有更好的方法。

搜索后,我找到了this article我学会了如何使用 `std::binary_function'。使用这两种方法,我检查了“耗时”。这是我的代码。

typedef int                                 USER_ID;
typedef std::string USER_NICK_NAME;
typedef std::map<USER_ID, USER_NICK_NAME> USER_MAP;

template<class T>
struct map_data_compare : public std::binary_function<typename T::value_type, typename T::mapped_type, bool>
{
public:
bool operator() (typename T::value_type &pair, typename T::mapped_type i) const
{
return pair.second == i;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
USER_MAP user_map;
string nick_prefix = "test";

//make test map
for (int i = 0; i < 100000; i++)
{
std::ostringstream stream;
stream << i;
user_map.insert(USER_MAP::value_type(i, nick_prefix + stream.str()));
}

const USER_NICK_NAME nick_name = "test99999";
clock_t t;

//Method 1 : using find_if + lambda
cout << "Method 1 : using find_if + lambda" << endl;
t = clock();
auto it = std::find_if(user_map.begin(), user_map.end(), [&](const USER_MAP::value_type& user)
{
return nick_name == user.second;
});
if (it != user_map.end())
{
cout << "found nickname " << nick_name.c_str() << ", at index " << it->first << endl;
}
t = clock() - t;
cout << "elapsed " << ((float)t)/CLOCKS_PER_SEC << " seconds" << endl;

cout << endl << endl;

//Method 2 : using find_if + binary_function
cout << "Method 2 : using using find_if + binary_function" << endl;
t = clock();
it = std::find_if(user_map.begin(), user_map.end(), std::bind2nd(map_data_compare<USER_MAP>(), nick_name));
if (it != user_map.end())
{
cout << "found nickname " << nick_name.c_str() << ", at index " << it->first << endl;
}
t = clock() - t;
cout << "elapsed " << ((float)t)/CLOCKS_PER_SEC << " seconds" << endl;

return 0;
}

在我的机器上,方法 1 总是比方法 2 快。这是测试结果控制台。 enter image description here

所以,我的问题是,

  1. 在我的情况下(我的意思是按值搜索 map ),find_if + lambda 是最好的方法吗?(不幸的是,我不能使用 boost 库。)
  2. 当我使用 std::binary_function 时?
  3. 我知道在 C++ 11 中,`std::binary_function' 已被弃用。我能知道原因吗?

感谢您花时间查看此主题并尝试提供帮助。

最佳答案

In my situation(I mean searching map by value), find_if + lambda is the best way?

这当然是最简洁的方法(假设您不能使用第二张 map ,或者可能是提升式多索引 map 来快速查找值)。原则上,使用等效的仿函数和/或 bind 应该不会慢很多,这里唯一的区别是 nick_name 是通过值而不是引用来捕获的;也许您没有启用优化,或者您的编译器没有像人们希望的那样优化 bind2nd

When I use std::binary_function?

从历史上看,如果您没有从它继承以将类型别名(first_argument_typesecond_argument_typeresult_type)注入(inject)到您的仿函数中不想自己定义它们。这些有时是必需的,例如,当使用像 bind2nd 这样的适配器(也被弃用)来创建一个基于你的仿函数的新仿函数时。

I know that in C++ 11, std::binary_function has bee deprecated. Could I know the reason?

它定义的类型对于像 bind 这样的新型可变参数适配器来说既不是必要的也不是足够的,所以它不再做任何有用的事情。

关于c++ - std::find_if 、 std::binary_function 用于按值搜索 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21235628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com