【发布时间】:2018-01-22 09:44:24
【问题描述】:
我试图拥有一个列表的迭代器向量,这将允许我访问或删除 O(1) 中的列表元素。 用例一方面是使用列表来定义优先级(front() 中的优先级最高的项目,而 back() 中的优先级最低的项目),但另一方面,可以直接访问每个列表节点(这样我就可以将任何项目从列表中间移动到 back() - 为此我需要从列表中间删除它)。 我知道这可能是不可能的,但我真的想进行最少的更改以使代码运行,而不是编写笨拙的代码(例如使用“pair”)来获得相同的功能。 我读过类似的帖子: Keeping vector of iterators of the data 和 Why can't I make a vector of references? 而且我知道它可能无法按照我想要的方式进行,但我确信它可以用最少的更改来完成。
这是一个示例程序:
#include <iostream>
#include <list>
#include <vector>
#include <functional>
using namespace std;
typedef struct _data
{
int d;
} tData;
typedef list <tData *> tListTest;
typedef vector <tListTest::iterator> tVecTest;
int main()
{
tListTest mylist;
tVecTest myvec;
tData *myData;
int i;
for (i=0; i<10; i++) {
cout << "Iteration " << i << endl;
cout << "Stage 1" << endl;
myData = new tData;
cout << "Stage 2" << endl;
myData->d = i;
cout << "Stage 3" << endl;
tListTest::iterator listIter = mylist.insert(mylist.end(), myData);
cout << "Stage 4" << endl;
myvec[i] = listIter;
cout << "Stage 5" << endl;
}
tListTest::iterator listIter = myvec[7];
cout << "Deleting " << (*listIter)->d << endl;
delete *listIter;
mylist.erase(listIter);
return 0;
}
这是输出:
Iteration 0
Stage 1
Stage 2
Stage 3
Stage 4
Segmentation fault (core dumped)
我尝试将矢量定义更改为:
typedef vector <reference_wrapper<tListTest::iterator>> tVecTest;
分配给:
myvec[i] = ref(listIter);
它没有帮助。
知道如何让这段代码运行吗?我很确定我快到了。
提前致谢
【问题讨论】:
-
delete *listIter;?!?你没有delete你没有new -
...和
myvec[i] = listIter;超出范围。抱歉,您想要实现的目标并不是很清楚,恐怕您的代码距离实现目标还有一步之遥 -
我假设您有详细的比较性能指标,这些指标为编写这种容易出错、内存泄漏、单一和复杂的代码提供了直接的理由。
-
刚刚意识到,当您删除
*listIter时,它指向了通过new创建的东西,但是我不明白为什么要这样做... -
你不需要在 C++ 中
typedef struct。所做的只是使您的类型的名称数量增加一倍。
标签: c++ list vector stl iterator