Answers:
采用 map::find
if ( m.find("f") == m.end() ) {
// not found
} else {
// found
}
map::count
count
返回int
一会儿就find
返回了整个迭代器。您可以保存迭代器的构造:)显然,如果以后要使用该值(如果存在),请使用find并存储其结果。
count
与find
使用需要独特的键地图时,在速度上几乎相同。(1)如果不需要元素来维持特定顺序,请使用std :: unordered_map,它具有近乎恒定的查找值,在存储多对时非常有用。(2)如果要使用该值(如果存在),请存储:: find的结果,并使用迭代器防止进行2次查找:auto it = m.find("f"); if (it != m.end()) {/*Use it->second*/}
要检查映射中是否存在特定键count
,请通过以下方式之一使用成员函数:
m.count(key) > 0
m.count(key) == 1
m.count(key) != 0
该文档的map::find
说:“其他部件的功能,map::count
可以用来只检查一个特定的键是否存在。”
所述文档为map::count
表示:“因为在地图容器中的所有元素是唯一的,该函数只能返回1(如果该元件被发现),或零(否则)”。
要通过已知存在的键从映射中检索值,请使用map :: at:
value = m.at(key)
与map :: operator []不同,map::at
如果指定的键不存在,则不会在映射中创建新键。
find
代替。second
返回的迭代器的属性find
可用于检索键的值。如果您使用count
then at
或operator[]
执行两项操作,而您本可以只使用一项。
if(m.count(key))
int
来bool
。尽管还有其他C ++编译器没有发出类似的警告,但我更喜欢使用显式比较来使意图更清晰并增强可读性。请注意,其他语言(例如C#)禁止进行这种隐式转换,以防止引入细微的编程错误。
C ++ 20使我们std::map::contains
能够做到这一点。
#include <iostream>
#include <string>
#include <map>
int main()
{
std::map<int, std::string> example = {{1, "One"}, {2, "Two"},
{3, "Three"}, {42, "Don\'t Panic!!!"}};
if(example.contains(42)) {
std::cout << "Found\n";
} else {
std::cout << "Not found\n";
}
}
我想你要map::find
。如果m.find("f")
等于m.end()
,则找不到密钥。否则,find返回指向所找到元素的迭代器。
错误是因为p.first
是一个迭代器,不适用于流插入。将最后一行更改为cout << (p.first)->first;
。p
是一对迭代器,p.first
是一个迭代器,p.first->first
是密钥字符串。
映射对于给定的键只能有一个元素,因此equal_range
不是很有用。它是为map定义的,因为它是为所有关联容器定义的,但是对于multimap来说,它要有趣得多。
C++17
通过进一步简化了此操作If statement with initializer
。这样,您就可以吃蛋糕了。
if ( auto it{ m.find( "key" ) }; it != std::end( m ) )
{
// Use `structured binding` to get the key
// and value.
auto[ key, value ] { *it };
// Grab either the key or value stored in the pair.
// The key is stored in the 'first' variable and
// the 'value' is stored in the second.
auto mkey{ it->first };
auto mvalue{ it->second };
// That or just grab the entire pair pointed
// to by the iterator.
auto pair{ *it };
}
else
{
// Key was not found..
}
map<string, string> m;
检查密钥是否存在,并返回出现的次数(在地图中为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
}
在您的问题中,错误是由错误的operator<<
重载引起的,因为p.first
是map<string, string>
,您无法将其打印出来。尝试这个:
if(p.first != p.second) {
cout << p.first->first << " " << p.first->second << endl;
}
cout
可能意味着与count
template <typename T, typename Key>
bool key_exists(const T& container, const Key& key)
{
return (container.find(key) != std::end(container));
}
当然,如果您想变得更高级,可以随时将同时包含找到的功能和未找到的功能的函数模板化,如下所示:
template <typename T, typename Key, typename FoundFunction, typename NotFoundFunction>
void find_and_execute(const T& container, const Key& key, FoundFunction found_function, NotFoundFunction not_found_function)
{
auto& it = container.find(key);
if (it != std::end(container))
{
found_function(key, it->second);
}
else
{
not_found_function(key);
}
}
并像这样使用它:
std::map<int, int> some_map;
find_and_execute(some_map, 1,
[](int key, int value){ std::cout << "key " << key << " found, value: " << value << std::endl; },
[](int key){ std::cout << "key " << key << " not found" << std::endl; });
缺点是想出一个好名字,“ find_and_execute”很尴尬,我想不出更好的办法...
比较std :: map :: find和std :: map :: count的代码,我想说第一个可能会带来一些性能优势:
const_iterator find(const key_type& _Keyval) const
{ // find an element in nonmutable sequence that matches _Keyval
const_iterator _Where = lower_bound(_Keyval); // Here one looks only for lower bound
return (_Where == end()
|| _DEBUG_LT_PRED(this->_Getcomp(),
_Keyval, this->_Key(_Where._Mynode()))
? end() : _Where);
}
size_type count(const key_type& _Keyval) const
{ // count all elements that match _Keyval
_Paircc _Ans = equal_range(_Keyval); // Here both lower and upper bounds are to be found, which is presumably slower.
size_type _Num = 0;
_Distance(_Ans.first, _Ans.second, _Num);
return (_Num);
}
我知道这个问题已经有了一些不错的答案,但是我认为我的解决方案值得分享。
它同时适用于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;
}
}
如果要比较一对地图,可以使用以下方法:
typedef map<double, double> TestMap;
TestMap testMap;
pair<map<double,double>::iterator,bool> controlMapValues;
controlMapValues= testMap.insert(std::pair<double,double>(x,y));
if (controlMapValues.second == false )
{
TestMap::iterator it;
it = testMap.find(x);
if (it->second == y)
{
cout<<"Given value is already exist in Map"<<endl;
}
}
这是一种有用的技术。
map <int , char>::iterator itr;
for(itr = MyMap.begin() ; itr!= MyMap.end() ; itr++)
{
if (itr->second == 'c')
{
cout<<itr->first<<endl;
}
}
std::pair<iterator,bool> insert( const value_type& value );
它返回的布尔值是多少?会告诉您密钥是否已经存在吗?