我试图获得列表的迭代器向量,这将允许我访问或擦除O(1)中的列表元素。 用例一方面是使用列表来定义优先级(在前面(),在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);
并没有帮助。
知道如何让这段代码运行?我很确定我几乎就在那里。
提前致谢
答案 0 :(得分:0)
默认情况下,矢量没有元素,也没有分配任何内存来保存元素。您的专线myvec[i] = listIter
会尝试访问尚未分配的元素i
。将声明更改为tVecTest myvec(10)
以预先分配10个元素。或者更好的是,将myvec[i] = listIter
更改为myvec.push_back(listIter)
。