我有这个变量:
std::map<std::string, double> courses;
如果它为某个键指定了值,我想打印它。所以我的键是字符串,所以我想要像:
std::cin >> mystring;
if (!(courses[mystring] == x)) std::cout << courses[mystring] << std::endl;
但我不知道该怎么做x。有什么想法吗?
答案 0 :(得分:2)
您可以执行courses.find(mystring) != courses.end()
。
答案 1 :(得分:1)
使用以下方法
auto it = courses.find( mystring );
if ( it != courses.end() ) std::cout << it->second << std::endl;
另一种方法是使用成员函数count
。它比使用方法find更简单,因为不需要定义迭代器。
if ( courses.count( mystring ) ) std::cout << courses[mystring] << std::endl;
或者甚至最好写
if ( courses.count( mystring ) != 0 ) std::cout << courses[mystring] << std::endl;
答案 2 :(得分:0)
您可以使用map::find
检查地图中是否有与某个键对应的项目。
std::map<std::string, double>::iterator iter = courses.find(mystring);
if ( iter != courses.end() )
{
std::cout << iter->second << std::endl;
}
使用find
并使用返回的迭代器对我来说更有意义,因为你只需要搜索一次项目。
使用类似的东西:
if( courses.count( mystring ) )
{
cout << courses[mystring] << endl;
}
的优点是代码更简单。但是,它可能需要付出代价。您可能需要两次搜索该项目。
答案 3 :(得分:0)
if( courses.count( mystring ) )
{
cout << courses[mystring] << endl;
}
不要过早优化,只需写出最简单,最清晰的内容。
即。如上所述使用count
, [1] 。
在这种情况下,使用带有find
的更复杂和冗长的代码的优化将极其 [2] ,因为迭代器的重用通常不能与时间涉及i / o,所以我建议反对。
<小时/> 1 )您可以添加0或例如0的比较如果将直接使用数字作为布尔值的旧C约定看起来神秘或奇怪,则
!!
转换为bool
。 count
将强制对项进行冗余的第二次搜索,但是地图实现可以自由地存储最后找到的迭代器值作为下一个的提示搜索,在这种情况下将其减少到O(1)。例如。看到std::map::emplace_hint
的复杂性。仅此一点将此优化考虑因素分类为过早,另外在I / o和小集合中搜索之间存在数量级差异,更不用说基于迭代器的代码的复杂性(附加变量)和详细程度。