std :: map :: erase бесконечный цикл - PullRequest
1 голос
/ 01 октября 2010

У меня есть map из vector из char и vector из strings. Время от времени, если раньше я видел вектор символов, я бы хотел добавить строку в мой вектор строк. Ниже приведен мой код для этого.

map<vector<char>, vector<string>>::iterator myIter = mMyMap.find(vChars);
if(myIter != mMyMap.end()) {
    vector<string> vStrings = myIter->second;
    mMyMap.erase(myIter);
    vStrings.push_back(some_other_string);
    mMyMap.insert(pair<vector<char>, vector<string>>(vChars, vStrings));
    return TRUE;
}

Вызов mMyMap.erase(), похоже, застрял в бесконечном цикле. Я предполагаю, что это потому, что vStrings не получает глубокую копию myIter->second.

Нужно ли инициализировать vStrings как:

vector<string> vStrings(myIter->second);

Или как правильно исправить?

Ответы [ 2 ]

3 голосов
/ 01 октября 2010

Я не вижу ошибки во фрагменте размещенного кода (кроме отсутствующего )).Но могу я предложить упростить строки 2-8 до:

if(myIter != mMyMap.end()) { 
    myIter->second.push_back(some_other_string); 
} 
1 голос
/ 01 октября 2010

vector vStrings = myIter-> second;
и
vector vStrings (myIter-> second);
это одни и те же вещи. Они оба вызывают конструктор копирования. И копия только глубокая. Я предполагаю, что вектор, который копируется, слишком велик (или длинный). Каждый элемент вектора будет скопирован один за другим. И отсюда время.

...