【问题标题】:Storing and managing std::list::iterator存储和管理 std::list::iterator
【发布时间】:2017-04-21 12:45:34
【问题描述】:

上下文:我正在网络中实现 MaxFlow 的 Push-Relable 算法,并希望跟踪所有节点的标签,对于每个可能的标签 (2*V-1 many) 我想要一个包含具有该标签的节点。

所以我有一个向量,其中每个条目都是一个列表。现在我需要从一个列表中删除一个元素并将其移动到另一个向量条目中的另一个列表中。 为了做到这一点,我使用了一个向量(其大小等于元素的数量),其中每个条目都是一个插入器,所以我总是知道每个元素的位置。 在更大规模地实施它之前,我想尝试一下它是否有效。所以我创建了两个向量,将一个元素添加到列表中,将迭代器存储在另一个向量中并尝试再次删除该元素。 但是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]);

【问题讨论】:

    标签: c++ list vector linked-list iterator


    【解决方案1】:

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

    你想要的是:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 2017-08-13
      • 2011-05-14
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 2011-09-26
      相关资源
      最近更新 更多