【问题标题】:C++ container of iterators and circular references [closed]迭代器和循环引用的 C++ 容器
【发布时间】:2009-07-21 16:27:00
【问题描述】:

我想创建两个相互包含迭代器的容器。我希望在不引入任何中间/间接类型的情况下做到这一点。这可能还是迭代器类型取决于知道容器数据类型的大小?

这是一些我想编译的示例代码:

#include <map>
#include <deque>
#include <string>

class mapvalue_t
{
  public:
    std::deque< std::map<std::string,mapvalue_t>::iterator  >::iterator i;
};

typedef std::map<std::string,mapvalue_t> maptype_t;
typedef std::deque< maptype_t::iterator > queuetype_t;

int main(void)
{
  maptype_t m;
  queuetype_t q;
}

没关系,它现在编译。我在那里有一个队列,而不是我想要的双端队列:)

【问题讨论】:

  • 我不确定将您的问题编辑为不再是一个问题是一种好习惯。

标签: c++ iterator containers


【解决方案1】:

如果您使用deque 而不是queue,则此方法有效。 Queue 不是容器,而是外观,因此它不支持 ::iterator 调用。

来自cplusplus.com

队列被实现为容器适配器,它们是使用特定容器类的封装对象作为其底层容器的类,提供一组特定的成员函数来访问它的元素。元素被推入特定容器的“后部”并从其“前部”弹出。

【讨论】:

    【解决方案2】:

    您应该非常小心地存储迭代器。修改集合很容易使所有迭代器失效。存储 id 或(托管)指针会更好。

    【讨论】:

    • 确实如此。每次以任何方式修改地图时,您存储的迭代器列表都会失效。您应该将键值存储到映射中。
    • 不完全正确。对于 map 和 list,插入和删除元素不会使任何迭代器失效(当然,被删除的迭代器除外)。我的问题应该有一个列表而不是双端队列,但我不知道我是否应该再次更新问题。
    • 如果我们依赖特定的实现。我不认为这是标准保证的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2015-02-08
    • 1970-01-01
    相关资源
    最近更新 更多