Добавление объектов в вектор внутри карты - PullRequest
1 голос
/ 09 апреля 2020
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;
}

Я пытаюсь вернуть sh некоторые объекты обратно в вектор внутри карты. Код компилируется без предупреждений, но вывод будет

1st:
a, 1st, 1st

вместо желаемого вывода

1st:
a, b, b

Не удается выяснить причину git причины. Вектор отлично работает с int, strings et c. и он должен работать с объектами, но по некоторым причинам это не так. Пробовал использовать указатели объектов, а безрезультатно. С уважением

1 Ответ

3 голосов
/ 09 апреля 2020

Ваша ошибка использует ссылку на строку в вашем Obj объекте.

Ваш код создает Obj, используя временные строки, а затем сохраняет ссылки на них. Это неопределенное поведение, и что бы ни указывало в вашей ссылке, это может быть что угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...