从列表向量中删除无法按预期工作



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

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

我希望删除列表向量中的第 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)
adjList.erase(adjList.begin()+1);

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

你的期望是错误的。

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

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

<小时 />
adjList.erase(adjList.begin());

我希望得到以下内容:1:3->0->空 2:4->空

你的期望是错误的。

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

擦除矢量的元素时,索引较大的元素会向左移动(这就是为什么从除矢量末尾以外的任何位置擦除都很慢的原因(。

最新更新