由c++中的双默认构造函数分配的值

Value assigned by double default constructor in c++

本文关键字:构造函数 分配 默认 c++      更新时间:2023-10-16

我有这个变量:std::map<std::string, double> courses;

如果它为某个键指定了值,我想打印它。所以我的钥匙是字符串,所以我想要这样的东西:

std::cin >> mystring;
if (!(courses[mystring] == x)) std::cout << courses[mystring] << std::endl;

但我不知道该做什么x。有什么想法吗?

您可以简单地执行courses.find(mystring) != courses.end()

使用以下方法

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; 

您可以使用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;
}

具有代码更简单的优点。然而,这可能是有代价的。您可能需要搜索两次该项目。

if( courses.count( mystring ) )
{
    cout << courses[mystring]  << endl;
}

不要过早地进行优化,只需写出最简单、最清晰的内容即可。

即使用如上所述的count[1]

在这种情况下,使用find的更复杂和详细的代码进行优化将是非常边际的,因为迭代器的重用通常无法与i/o所涉及的时间相比,所以我建议不要这样做。


1(如果直接使用数字作为布尔值的旧C惯例看起来很神秘或奇怪,您可以添加与0的比较,或者例如!!bool的转换
2(人们可能认为使用count会强制对项目进行冗余的第二次搜索,但映射实现可以自由地存储最后找到的迭代器值作为下一次搜索的提示,在这种情况下将其减少为O(1(。例如,参见std::map::emplace_hint的复杂性。仅此一点就将这种优化考虑归类为过早,此外,i/o和在小集合中搜索之间存在数量级差异,更不用说基于迭代器的代码的复杂性(额外变量(和冗长性了