C++ algorithm find_if in map



我想在map中找到pair,然后打印出来。这是我的代码:

std::map<std::string, std::string> mLoginPasswordMap{ "test", "test2" };
std::string key1("test");
std::string value1("test2");
auto it = std::find_if( mLoginPasswordMap.cbegin(),
mLoginPasswordMap.cend(),
[&key1, &value1]( const auto& elem )
{
return ( key1 == elem.first && value1 == elem.second );
});
if( it != mLoginPasswordMap.cend() )
{
std::cout << it->first << endl;
std::cout << it->second << endl;
}
if( it == mLoginPasswordMap.cend() )
{
std::cout << "No pair in map" << endl;
}

和我收到这种错误时,程序正在编译:

usr/include/c++/9/bits/stl_map.h:273:4:   required from ‘std::map<_Key, _Tp, _Compare, _Alloc>::map(_InputIterator, _InputIterator) [with _InputIterator = const char*; _Key = std::__cxx11::basic_string<char>; _Tp = std::__cxx11::basic_string<char>; _Compare = std::less<std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >]’
main.cpp:23:79:   required from here
/usr/include/c++/9/ext/new_allocator.h:146:4: error: no matching function for call to ‘std::pair<const std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> >::pair(const char&)’
146 |  { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
|    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我不知道我做错了什么。有人能帮我吗?

只需以简单的方式填充地图,而不是:

std::map<std::string, std::string> mLoginPasswordMap;
mLoginPasswordMap["test"] = "test2";

那么你的代码就可以工作了。

也就是说,这不是使用map的方式。如果您确实需要搜索(并不适用于映射),更好的方法是:

std::map<std::string, std::string> mLoginPasswordMap;
mLoginPasswordMap["test"] = "test2";
std::string key1("test");
std::string value1("test2");
std::map<std::string, std::string>::iterator it;
for(it = mLoginPasswordMap.lower_bound(key1); it != mLoginPasswordMap.upper_bound(key1); it++)
{
if (it->second == value1)
{
break;
}
}
if( it != mLoginPasswordMap.cend() && it->second == value1)
{
std::cout << it->first << endl;
std::cout << it->second << endl;
}
else
{
std::cout << "No pair in map" << endl;
}

这样,您实际上利用map而不遍历它。upper_boundlower_bound是搜索范围的常用方法。

现在,如果你有一个map,想要搜索一个给定的键:

std::map<std::string, std::string> mLoginPasswordMap;
mLoginPasswordMap["test"] = "test2";
std::string key1("test");
std::string value1("test2");
auto it = mLoginPasswordMap.find(key);
if(it != mLoginPasswordMap.end())
{
std::cout << it->first << endl;
std::cout << it->second << endl;
}
else
{
std::cout << "No pair in map" << endl;
}

最新更新