提问人:L. Kicki 提问时间:6/20/2022 最后编辑:273KL. Kicki 更新时间:6/20/2022 访问量:161
地图中的C++算法find_if
C++ algorithm find_if in map
问:
我想在地图中找到一对并打印出来。 这是我的代码:
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)...); }
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我不知道我做错了什么。 有人可以帮助我吗?
答:
0赞
Jeffrey
6/20/2022
#1
只需以简单的方式填充地图,即可:
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_bound
lower_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;
}
评论
0赞
Nathan Pierson
6/20/2022
lower_bound
而且似乎仍然比仅仅复杂得多upper_bound
mLoginPasswordMap.find(key1);
0赞
Jeffrey
6/20/2022
呸。是的,这是正确的:-)。假设这个答案是面向多映射的,并且是一个更复杂的谓词
评论
mLoginPasswordMap{ {"key", "value" } };
if(condition) { } if(!condition) { }
if(condition) { } else { }
std::map::find()。
std::map
std::find_if()
void foo() {
}
#include