c++ - 存储和管理 std::list::iterator

标签 c++ list vector linked-list iterator

上下文:我正在网络中实现 MaxFlow 的推送相关算法,并希望跟踪所有节点的标签,对于我想要的每个可能的标签(2*V-1 很多)有一个包含带有该标签的节点的双向链表。

所以我有一个 vector ,其中每个条目都是一个列表。现在我需要从一个列表中删除一个元素并将其移动到另一个 vector 条目中的另一个列表中。 为此,我使用了一个 vector (其大小等于元素的数量),其中每个条目都是一个interator,所以我总是知道每个元素的位置。 在更大规模地实现它之前,我想尝试一下它是否有效。所以我创建了两个 vector ,将一个元素添加到列表中,将迭代器存储在另一个 vector 中并尝试再次删除该元素。 但是 std::vector::erase() 方法总是让我遇到 SegFaults。我错过了什么吗?

int V=50; 
int i=0, v=42;

vector<list<int> > B(2*V-1);
vector<list<int>::iterator> itstorage(V) ;

B[i].push_back(v);
itstorage[v]=B[i].end();

B[i].erase(itstorage[v]);

最佳答案

B[i].end() 不是指你推送的最后一个项目,它是你推送的项目之后的一个。

你想要的是:

std::list<int>::iterator p = B[i].end();
--p;

或者,您可以使用 insert 成员函数,而不是使用 push_back,它返回一个迭代器到新插入的项目。

itstorage[v] = B[i].insert(B[i].end(), v);

关于c++ - 存储和管理 std::list::iterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41002809/

相关文章:

c++ - 使用 get 函数访问存储在节点中的数据

c++ - Qt 5.1 qHash 错误

c# - C# 中是否有 List<T> 的方法,例如在 c++ 中为 vector<T> 调整大小

c++ - 重新分配 vector 的内存

c++ - 向 std::vector 添加结构时的 std::bad_alloc

c++ - eMbedded Visual C++ 4.0 for Windows CE 中的模板函数

c++ - 参数依赖查找是否也只搜索 namespace 或类?

python - 正确值的文件输出错误

c++ - 打印双向链表

c++ - std::vector 中的 erase() 是线性时间操作吗?