- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么我不能将 const Key_Type&
传递给 std::map 的 operator[]?我已经完成了这个并且它编译了但是在运行时 std::bad_alloc
异常被抛出:
std::map<std::string, int> myMap;
const std::string& f(const std::string& groupA, const std::string& groupB)
{
return groupA > groupB ? groupA + groupB : groupB + groupA;
}
std::cout << myMap[f("a", "b")];
最佳答案
您正在函数 const std::string& f(const std::string& groupA, const std::string& groupB)
return groupA > groupB ? groupA + groupB : groupB + groupA;
+
运算符返回一个临时值,然后通过引用返回该值。
因此改变按值返回的返回类型(const std::string
)解决了这个问题。
正如 @Narek 所指出的,Herb Sutter 如何解释对临时变量使用 const ref。但是我们的问题陈述与 Sutter 讨论的内容不符。为了解释更多,我创建了一个小程序。该程序解释了问题和解决方案:
#include <iostream>
#include <map>
/*
std::map<std::string, int> myMap;
const std::string& f(const std::string& groupA, const std::string& groupB)
{
return groupA > groupB ? groupA + groupB : groupB + groupA;
}*/
struct X{
int member;
X():member(0){
std::cout<<"X ctr "<<std::endl;
}
X(const X& rhs){
std::cout<<"X copy ctr "<<std::endl;
}
~X(){
std::cout<<"X dtr"<<std::endl;
member = -1;
}
};
void f2(const X& obj){
std::cout<<"func "<<obj.member<<std::endl;
}
const X& f3(){
return X();
}
X f4(){
return X(); //ideally not a good idea, exception is
//http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/
}
int main()
{
/* myMap["ba"] = 1;
std::cout <<"key "<< f("a", "b")<<std::endl;
std::cout << myMap[f("a", "b")]<<std::endl;*/
std::cout << "-----Faulty Case-----------"<<std::endl;
//reference returned by f3 is local to f3 call and
//is destructed as soon as f3() is out of stack
//and hence the reference in f2() is not valid
f2( f3() );
std::cout <<std::endl<< "-----Correct way-----------"<<std::endl;
//A temporary object is returned by f4 which is then referred by reference in f2.
//This reference is alive in stack of f2 and hence can be used inside
//f2 with valid results.
//As explained in following article, the refernce should remain
//alive in stack to use temporary objects.
//http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/
f2( f4() );
//note in previous expression, f4 returns by value but still copy ctr is not invoked,
//this I believe is Return Value Optimization (might be compiler dependent)
return 0;
}
这个程序的输出:
main.cpp: In function �const X& f3()�:
main.cpp:41:14: warning: returning reference to temporary [-Wreturn-local-addr]
return X();
^
Executing the program....
$demo
-----Faulty Case-----------
X ctr
X dtr
func -1
-----Correct way-----------
X ctr
func 0
X dtr
我希望这会拨开乌云。
关于c++ - 将 const Key_Type& 传递给 std::map 的 operator[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24990370/
我正在制作一款带有简单库存系统的视频游戏。我正在尝试做到这一点,以便每当您按下“Z”键时,它都会显示或隐藏库存 GUI。我不知道为什么,但是 KEY_TYPED 按键事件不起作用。 KEY_PRESS
我有一个带有许多文本字段的Java应用程序,我可以通过按`然后按e输入例如é。这是许多应用程序中已知的行为。 现在,在特定的用户操作(启动应用程序的特定模块)之后,应用程序中的所有文本字段将无法键入
我有一个 KeyboardFocusManager 具有覆盖的 dispatchKeyEvent() 方法来处理箭头键和输入的导航。只要按键被按下,我就需要处理按键事件。不幸的是,按住 enter 会
我一直在尝试通过重写书中的问题来学习按键绑定(bind),这些问题是我之前使用 KeyListener 解决的。我正在努力使用按键绑定(bind)解决的问题需要我记录已输入的消息并将其显示在面板上。
我编写这段代码是为了检查 std::map 是否存在包含一个特定的键: template inline bool contains(const std::map& map, const T& valu
我有一个类模板 ID ,目前使用对象的地址作为其标识符。 我想对此类模板进行专门化,这样如果 T有一个 key_type定义,我会调用get_key()在对象上并将其用作标识符。当然,我也会存储那个值
我有一个在标准容器上运行的 X 类。以 value_type 作为参数的函数必须调用以 key_type 作为参数的函数。我怎么做?我看起来很基础。 template class X { void
std::map::find接受 const key_type&作为论据。这样,它要求参数可转换为 key_type .这对我来说似乎是一个疏忽,因为该参数不必可转换为key_type。 ,它只需要与
我正在尝试创建一个以 xercesc::XMLUri 作为键类型的 std::unordered_map。 #include #include "xercesc/util/XMLUri.hpp" i
我想出了以下代码,它演示了一种在 STL 集合上进行通用迭代并获取键值的技术,而不管键的存储方式如何。 这里的上下文是我正在重构两个函数,它们都在两个集合上运行相同的功能:一个是 set另一个是 ma
我有一个这样的容器: // Sort functor struct SortByTime : std::binary_function { bool operator()(const Ti
我在 std::map 中自定义比较,如下所示。 class my_cmp { public: bool operator()(const string &a, const string &b)
我有一张 map : std::map myMap; 但是,在某些情况下,我想通过比较 TyString == TyStringRef 来std::map::find 一个条目,即 myMap.fin
我对以下 C 代码行感到有点困惑: typedef void* key_type; 这是否意味着 key_type 是一个空指针?我想这是比 C 编程中的 void* 更直观的命名。 - 谢谢 最佳答
这是我对 Box 类的实现: class Box { friend ostream& operator bmap; bmap.insert(pair(b1, 10)); bma
最近去使用std::unordered_map::erase,发现函数有一些重载: Link to cppreferences iterator erase( const_iterator pos )
我正在跟踪一个错误,但遇到了非常奇怪的行为。我有一组指针,当我一个一个地删除它们时,第一个删除,但删除另一个给我段错误。我用 size_type erase( const key_type& k
I am thinking from Java help:The complete reference(8th Ed) by Herbert Schildt to learn about Java.在
这是我的情况的说明。我有一个 std::map我想找到第一个 pair其中 key 是 key 等价类的任何成员。 #include struct Category { int foo;
我有一个类(class)目录类,它有一个 map Courses 类型的私有(private)变量.我想重载 ,你可以重载 <<对于 CourseInfo : std::ostream& operat
我是一名优秀的程序员,十分优秀!