管理迭代器容器(特别是列表迭代器的向量)

时间:2018-01-22 09:44:24

标签: c++ list vector stl iterator

我试图获得列表的迭代器向量,这将允许我访问或擦除O(1)中的列表元素。 用例一方面是使用列表来定义优先级(在前面(),在back()中具有最优先的项目,以便具有最少优先级的项目),但另一方面,要获得直接访问权限每个列表节点(这样我就可以将任何项目从列表中间移动到后面() - 为此我需要从列表中间删除它)。 我知道这可能是不可能的,但我真的想做最少的改动让代码运行,而不是编写一个尴尬的代码(例如使用" pair")来获得同样的代码功能。 我读过以下帖子: Keeping vector of iterators of the dataWhy 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);

并没有帮助。

知道如何让这段代码运行?我很确定我几乎就在那里。

提前致谢

1 个答案:

答案 0 :(得分:0)

默认情况下,矢量没有元素,也没有分配任何内存来保存元素。您的专线myvec[i] = listIter会尝试访问尚未分配的元素i。将声明更改为tVecTest myvec(10)以预先分配10个元素。或者更好的是,将myvec[i] = listIter更改为myvec.push_back(listIter)