Стирание из вектора списка не работает должным образом - PullRequest
0 голосов
/ 17 сентября 2018

Это простая вещь, которую я делаю, но она не работает, как я ожидал.

int main(){
    vector<list<int>> adjList(3);
    adjList[0].push_back(1);
    adjList[0].push_back(2);
    adjList[1].push_back(3);
    adjList[1].push_back(0);
    adjList[2].push_back(4);
    cout << "Original graph...\n";
    printGraph(adjList);

    cout << "\nAfter deleting the zeroth index...\n";

    adjList.erase(adjList.begin());

    printGraph(adjList);

    return 0;

}


Original graph...
0:1->2->NULL
1:3->0->NULL
2:4->NULL

After deleting the zeroth index...
0:3->0->NULL
1:4->NULL

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

Я уверен, что мне здесь не хватает чего-то простого, но просто не могу понять, что это такое.

Любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

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

Original graph...
0:1->2->NULL
1:3->0->NULL
2:4->NULL

After deleting the zeroth index...

0:3->0->NULL (index 1 becomes 0)
1:4->NULL (index 2 becomes 1)
0 голосов
/ 17 сентября 2018
adjList.erase(adjList.begin()+1);

Я ожидал, что нулевой индекс в моем векторе списка будет удален.

Ваши ожидания неверны.

adjList.begin()+1 является итератором для элемента с индексом 1. Следовательно, удаление этого итератора приведет к удалению элемента с индексом 1 (то есть второго элемента).

adjList.begin() является итератором для элемента с индексом 0, поэтому, если вы хотите стереть этот элемент, то это итератор, который вам необходимо стереть. Однако обратите внимание, что если вам нужно часто стирать первый элемент последовательности и сохранять последовательность в исходном порядке, то вектор - неэффективный выбор. В таком случае вы можете рассмотреть возможность использования deque.


 adjList.erase(adjList.begin());

Я ожидал получить следующее: 1: 3-> 0-> NULL 2: 4-> NULL

Ваши ожидания неверны.

Вектор никогда не пропускает никаких индексов. Если в векторе имеется n элементов, то эти элементы находятся в индексах 0 ... n-1.

Когда вы стираете элемент вектора, элементы с большими индексами сдвигаются влево (поэтому удаление из любого места, кроме конца вектора, происходит медленно).

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