从列表向量中擦除无法正常工作

时间:2018-09-17 00:05:35

标签: c++ graph stl

这是我正在做的一件简单的事情,但是它没有按我预期的那样工作。

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 :(得分:0)

adjList.erase(adjList.begin()+1);
     

我希望列表向量中的第零个索引被删除。

您的期望是错误的。

adjList.begin()+1是索引1的元素的迭代器。因此,擦除该迭代器将导致索引1的元素(即第二个元素)被擦除。

adjList.begin()是索引为0的元素的迭代器,因此,如果您要擦除该元素,则需要擦除该迭代器。但是请注意,如果您需要经常擦除序列的第一个元素,并且需要按原始顺序保留序列,那么向量是一种低效的选择。在这种情况下,您可能要考虑使用双端队列。


 adjList.erase(adjList.begin());
     

我希望得到以下信息:1:3-> 0-> NULL 2:4-> NULL

您的期望是错误的。

向量从不跳过任何索引。如果向量中有n个元素,则这些元素的索引为0 ... n-1。

擦除向量的元素时,索引较大的元素会向左移动(这就是为什么从向量的末尾(从向量末尾开始)擦除缓慢的原因。

答案 1 :(得分:0)

我的坏。我现在知道出了什么问题。我期望删除后会看到相同的索引,但是当然这是一个错误的期望。因此输出实际上恰好就是索引移动。

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)