我试图检查一个给定的键是否在一个映射中,有点不能这样做:
typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here
那么我怎么打印p中的内容呢?
map<string, string> m;
检查键是否存在,返回出现的个数(map中0/1):
int num = m.count("f");
if (num>0) {
//found
} else {
// not found
}
检查键是否存在,并返回迭代器:
map<string,string>::iterator mi = m.find("f");
if(mi != m.end()) {
//found
//do something to mi.
} else {
// not found
}
在你的问题中,错误操作符<<重载引起的错误,因为p.first是映射<字符串,字符串>,你不能打印出来。试试这个:
if(p.first != p.second) {
cout << p.first->first << " " << p.first->second << endl;
}
要检查映射中是否存在特定的键,可以通过以下方式之一使用count成员函数:
m.count(key) > 0
m.count(key) == 1
m.count(key) != 0
map::find的文档说:“另一个成员函数map::count可用于检查特定键是否存在。”
map::count的文档说:“因为map容器中的所有元素都是唯一的,所以函数只能返回1(如果找到元素)或0(否则)。”
要通过已知存在的键从映射中检索值,请使用map::at::
value = m.at(key)
与map::operator[]不同,如果指定的键不存在,map::at将不会在映射中创建一个新的键。
我知道这个问题已经有了一些很好的答案,但我认为我的解决方案值得分享。
它适用于std::map和std::vector<std::pair<T, U>>,从c++ 11可用。
template <typename ForwardIterator, typename Key>
bool contains_key(ForwardIterator first, ForwardIterator last, Key const key) {
using ValueType = typename std::iterator_traits<ForwardIterator>::value_type;
auto search_result = std::find_if(
first, last,
[&key](ValueType const& item) {
return item.first == key;
}
);
if (search_result == last) {
return false;
} else {
return true;
}
}