Векторные итераторы (строки) внутри карты - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь создать карту C ++, содержащую строку в качестве ключа и итератор C ++ (векторный итератор) в качестве значения. В прилагаемом коде: у меня есть вектор с именем numbers , в котором хранится значение ключа, и я беру итератор этого элемента вектора, хранящего его на карте, под названием Directory . Код должен работать так, как написано, но когда я пытаюсь напечатать значение ключа каталога, некоторые значения не отображаются в каталоге. Мне действительно нужно еще раз взглянуть на это, поскольку я уже часами не знаю, в чем я не прав. Пожалуйста, помогите!

#include <iostream>
#include <vector>
#include <map>
using namespace std;
vector<string> keys;
map<string, vector<string>::iterator> Directory;
void printStuff()
{
    for (auto x : Directory)
    {
        cout << "Key: " << x.first << "---- Value: " << (*x.second) << endl;
    }
}
void add()
{
    string name;
    string number;
    printf("Enter Key : ");
    cin >> name;
    printf("Enter Value : ");
    cin >> number;
    keys.push_back(number);
    vector<string>::iterator num;
    num = keys.end() - 1;
    Directory[name] = num;
}
int main()
{
    int ch = 10;
    while (ch != 0)
    {
        cout << "1. Add a Contact\n";
        cout << "2. Lookup Directory\n";
        cin >> ch;
        switch (ch)
        {
        case 1:
            add();
            break;

        case 2:
            printStuff();
            break;

        case 3:
            exit(0);
            break;
        }
    }
    return 0;
}

1 Ответ

0 голосов
/ 09 ноября 2019

После этого оператора

keys.push_back(number);

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

Вместо вектора используйте контейнер std::list.

...