【问题标题】:Adding objects into vector inside map将对象添加到地图内的矢量中
【发布时间】: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


【解决方案1】:

您的错误是在您的 Obj 对象中使用了对字符串的引用。

您的代码正在使用临时字符串构建Obj,然后存储对它们的引用。这是未定义的行为,无论您的引用最终指向什么,都可能是任何东西。

【讨论】:

  • 使用引用是未定义的。单独悬空引用是没有问题的
  • @idclev463035818 我必须仔细检查,但我很确定与指针不同,即使创建无效引用在技术上也是未定义的。根据语言规则,引用应始终有效。
  • 我不得不承认我并不完全确定。我会做一些研究
  • @idclev463035818 这里有一些好东西stackoverflow.com/questions/14730534/…
  • @idclev463035818 我现在在想,创建一个无效的引用总是错误的,但是拥有一个曾经有效且超出范围的引用,即悬空,只有在你使用它时才是错误的,因为你说。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
相关资源
最近更新 更多