【问题标题】:Managing a container of iterators (specifically, a vector of iterators of a list)管理迭代器容器(特别是列表的迭代器向量)
【发布时间】:2018-01-22 09:44:24
【问题描述】:

我试图拥有一个列表的迭代器向量,这将允许我访问或删除 O(1) 中的列表元素。 用例一方面是使用列表来定义优先级(front() 中的优先级最高的项目,而 back() 中的优先级最低的项目),但另一方面,可以直接访问每个列表节点(这样我就可以将任何项目从列表中间移动到 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);

它没有帮助。

知道如何让这段代码运行吗?我很确定我快到了。

提前致谢

【问题讨论】:

  • delete *listIter; ?!?你没有delete你没有new
  • ...和myvec[i] = listIter; 超出范围。抱歉,您想要实现的目标并不是很清楚,恐怕您的代码距离实现目标还有一步之遥
  • 我假设您有详细的比较性能指标,这些指标为编写这种容易出错、内存泄漏、单一和复杂的代码提供了直接的理由。
  • 刚刚意识到,当您删除 *listIter 时,它指向了通过 new 创建的东西,但是我不明白为什么要这样做...
  • 你不需要在 C++ 中typedef struct。所做的只是使您的类型的名称数量增加一倍。

标签: c++ list vector stl iterator


【解决方案1】:

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

【讨论】:

  • 嗨,非常感谢 Violet 的回答——关于向量预分配的第一句话非常有用。我 100% 肯定它是自动完成的,所以我没有再考虑这一点。关于 listIter 的第二条评论,请注意其中有 2 个 - 一个在 for 循环内部,一个在外部。由于是测试人员,我没有花太多时间在漂亮的编码上,但代码编译运行。
  • @user9250533: 好点,我不专心,很抱歉造成混乱。很高兴我的回答仍然部分有用。
猜你喜欢
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2011-11-15
相关资源
最近更新 更多