gpt4 book ai didi

vector 的 vector 的 C++ 迭代器

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:27:02 25 4
gpt4 key购买 nike

为什么我会遇到段错误??

    std::vector<std::vector<int> > cells;
std::vector<std::vector<int>::iterator> cellitr;

for(int i=0;i<10;i++)
{
std::vector<int> c;
std::vector<int>::iterator citr;
citr= c.begin();
for(int j=0;j<10;j++)
{
c.push_back(j);
}
cells.push_back(c);
cellitr.push_back(citr);
}
qDebug()<<cells[5][6];
int *x = &cells[5][6];
cells[5].insert(cellitr[5],200);//SEG FAULT HERE
qDebug()<<cells[5][6];

我有一个 vector 的 vector 和迭代器的 vector ,我正在尝试使用迭代器的索引在其中一个子 vector 中插入一个值。

有什么想法吗??

最佳答案

您的程序中有两个未定义行为的来源。

首先,当你这样做的时候:

c.push_back(j);

您正在增加 vector 的大小。如果 vector 的大小超过了它的容量, vector 必须重新分配一个更大的存储空间来保存它的当前元素它的新元素——这是因为 vector 必须始终将元素存储在一个连续的存储区域中。

当重新分配发生时,迭代器将失效。特别是,您的迭代器 citr 可能在插入之前以这种方式获得:

citr= c.begin();

将会失效。取消引用无效的迭代器会在您的程序中注入(inject)未定义的行为。

其次,当你这样做的时候:

cellitr.push_back(citr);

您正在将迭代器存储到 vector (c) 中,当循环退出时该迭代器将超出范围 - 这将使存储的迭代器成为无效迭代器。同样,取消对无效迭代器的引用会给您带来未定义的行为。


为了避免这两种未定义行为的来源,您可以按如下方式更改循环:

cells.reserve(10);
for(int i=0;i<10;i++)
{
std::vector<int> c;
for(int j=0;j<10;j++)
{
c.push_back(j);
}

cells.push_back(c);
cellitr.push_back(cells.back().begin());
}

注意,在 C++11 中你可以避免内部循环并使上面的代码更紧凑:

#include <algorithm> // For std::iota() (C++11 only)

// ...

cells.reserve(10);
for(int i=0;i<10;i++)
{
std::vector<int> c(10);
std::iota(c.begin(), c.end(), 0);

cells.push_back(c);
cellitr.push_back(cells.back().begin());
}

关于 vector 的 vector 的 C++ 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17134121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com