由c++中的双默认构造函数分配的值
Value assigned by double default constructor in c++
我有这个变量: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和在小集合中搜索之间存在数量级差异,更不用说基于迭代器的代码的复杂性(额外变量(和冗长性了
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- C 字符串在显式构造函数中分配值C++?
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 在构造函数中分配内存失败是如何冒泡的
- 当我尝试通过构造函数分配 char 数组时出现错误
- 如何使用函数(而不是构造函数)将派生类对象分配给基类指针
- 当设置对象等于另一个函数的返回值时,为什么要调用移动构造函数/分配
- 如何安全地释放构造函数分配的资源
- 是否可以在基类中删除复制和移动构造函数/分配运算符
- 如何在隐式复制构造函数/分配运算符中压制成员
- 使用超载构造函数分配
- 使用构造函数分配内存
- 如何使用复杂构造函数分配对象
- 将类构造函数分配给具有参数的新构造函数C++
- 在构造函数分配后更改vtable内存
- 在尝试使用 new 和 copy 构造函数分配内存时,在 '(' 令牌之前获取"预期的非限定 id"
- 为存储库构造函数分配内存
- 由c++中的双默认构造函数分配的值
- 将派生类构造函数分配给基类指针