【发布时间】:2020-04-09 15:52:57
【问题描述】:
class Obj {
private:
const string & m_String;
public:
Obj ( const string & x )
: m_String ( x ) {}
... // getters, overloaded operators etc
};
int main ( void ) {
// new map
map<string, vector<Obj>> myMap;
myMap . insert ( pair<string, vector<Obj>> ("1st", vector<Obj>() ) );
Obj a1 ("a"), a2 ("b");
// add three elements into "1st"
myMap["1st"] . push_back (a1);
myMap["1st"] . push_back (a2);
myMap["1st"] . push_back (a2);
// display contents of all vecs inside map
for ( map<string, vector<Obj>>::const_iterator it1 = myMap . begin(); it1 != myMap . end(); ++it1 ) {
cout << it1 -> first << ":"<< endl;
for ( vector<Obj>::const_iterator it2 = it1->second . begin(); it2 != it1->second . end(); ++it2) {
cout << *it2;
if ( it2 != prev(it1->second . end()) ) cout << ", ";
else cout << endl;
}
}
return 0;
}
我正在尝试将一些对象推回地图内的向量中。代码编译没有警告 但输出是
1st:
a, 1st, 1st
而不是所需的输出
1st:
a, b, b
无法找出合理的原因。向量适用于整数、字符串等,它应该适用于对象,但由于某种原因它不能。尝试使用对象的指针也无济于事。 问候
【问题讨论】:
-
您已经编辑了最重要的部分,即
Obj的构造函数,但由于没有理智的方法Obj a1 ("a");最终会引用一个有效的std::string我敢打赌m_String每次都是悬空引用。 -
为什么需要一个字符串引用作为成员?为什么不简单地
std::string m_String?我们可能会进入XY Problem 领域。 -
你的
Obj类中有一些东西,因为简单地将其替换为std::string会导致正确的行为:godbolt.org/z/Ja4QxJ 我认为问题是 - 你在某处有一个悬空的参考 - 你的Obj的成员是一个引用,可能您为其分配了一个临时字符串(例如这里:Obj a1 ("a"), a2 ("b");)。你的构造函数中可能有一些黑魔法,但我不这么认为:) UPD:构造函数现在出现了,我的假设是正确的 -
感谢回复,改成普通字符串就可以了!
标签: c++ containers