У моего std::map
есть пара уникальных ключей и уникальное значение. Я обычно нахожу ключ для значения и нахожу значение для ключа, а также. Я уже знаю метод, который с помощью std::find_if
+ лямбда, однако я хочу знать, есть ли какие-нибудь лучшие способы.std :: find_if, std :: binary_function для поиска std :: map по значению
После поиска я нашел 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 всегда быстрее, чем Method2. Это консоль результатов теста.
Итак, мой вопрос,
- В моей ситуации (я имею в виду поиск карты по значению),
find_if
+ лямбда является лучшим способом? (К сожалению, я не могу использовать библиотеку boost.) - Когда я использую
std::binary_function
? - Я знаю, что в C++ 11 `std :: binary_function 'устарел пчел. Могу ли я узнать причину?
Спасибо, что посмотрели эту тему и попытались помочь.
Причина для устаревания этого и 'std :: bind2nd' заключается в том, что теперь мы имеем' std :: function' и 'std :: bind'. – chris
Вы можете использовать C++ 11, но не Boost? Интересно ... 'bimap' идеально подходит для вас. –
У вас есть прозрачный оператор C++ 1y на основе 'set' /' map'? – Yakk