Как связать указатель на элемент std :: vector - PullRequest
0 голосов
/ 29 февраля 2020

Я хочу связать указатель с одним из элементов данных вектора std.

int main()
{
    std::vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    vec.push_back(4);
    vec.push_back(5);
    int *ip = &vec[2];
    std::cout << *ip << std::endl;
    vec.erase(vec.begin() + 1); 
    std::cout << *ip << std::endl;
    while (!_kbhit())
    {


    }
    std::cout << "Hello World!\n"; 
}

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

Как сделать указатель, указывающий на тот же элемент данных, даже после изменения размера вектора?

1 Ответ

3 голосов
/ 29 февраля 2020

Вместо этого вы можете использовать std::list, у которого есть иногда полезное свойство, заключающееся в том, что итераторы и указатели на значения, содержащиеся в них, не становятся недействительными при вставке или удалении других элементов.

Если вы хотите целочисленную индексацию, используйте std::map<int, int> вместо. Как и std::list, это контейнер на основе узлов, который не делает недействительными итераторы или указатели при вставке или удалении других элементов. Вы можете подражать vector::push_back() так:

void push_back(std::map<int, int>& to, int value) {
    int index = to.empty() ? 0 : ((--to.end())->first + 1);
    to.emplace(index, value);
}       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...