【问题标题】:Get a pointer to STL container an iterator is referencing?获取指向迭代器引用的 STL 容器的指针?
【发布时间】:2012-07-11 19:13:55
【问题描述】:

例如,以下是可能的:

std::set<int> s;  
std::set<int>::iterator it = s.begin();

我想知道是否可能相反,比如说,

std::set<int>* pSet = it->**getContainer**();  // something like this...

【问题讨论】:

  • 我很想知道你为什么想要这个。
  • 我正在尝试做的是在(某些其他数据结构的)遍历期间保存迭代器的状态,以便我可以在下次访问时增加迭代器。如果上述情况可行,那么我不必保留指向容器本身的引用/指针,而只需保留指向该迭代器的指针。

标签: c++ stl


【解决方案1】:

不,没有便携的方法可以做到这一点。

迭代器甚至可能没有对容器的引用。例如,对于std::array&lt;T, N&gt;std::vector&lt;T&gt;,实现可以使用T* 作为iterator 类型,因为两者都将它们的元素存储为数组。

此外,迭代器比容器更通用,并不是所有的迭代器都指向容器(例如,存在从流中读取和写入的输入和输出迭代器)。

【讨论】:

  • 这是旧的,但我有一个非常小的问题。假设迭代器(不一定来自 STL)确实源自容器,它可能拥有也可能不拥有指向其原始容器的指针/引用。但如果是这样,那么容器的类型和容器本身对于迭代器的用户来说是绝对知道的,不是吗?当然,除非容器的指针/引用被定义为私有的,但是程序员为什么要隐藏它呢?
【解决方案2】:

没有。在找到迭代器时,您必须记住迭代器来自的容器。

这个限制的一个可能原因是指针是有效的迭代器,没有办法让指针找出它来自哪里(例如,如果你将 4 个元素指向一个数组,那么仅从那个指针如何可以你告诉数组的开始在哪里?)。

【讨论】:

    【解决方案3】:

    至少有一个std 迭代器和一些技巧是可能的。 std::back_insert_iterator 需要一个指向容器的指针来调用它的 push_back 方法。此外,这个指针只是protected

    #include <iterator>
    
    template <typename Container>
    struct get_a_pointer_iterator : std::back_insert_iterator<Container> {
        typedef std::back_insert_iterator<Container> base;
        get_a_pointer_iterator(Container& c) : base(c) {}
        Container* getPointer(){ return base::container;}
    };
    
    #include <iostream>
    int main() {
        std::vector<int> x{1};
        auto p = get_a_pointer_iterator<std::vector<int>>(x);
        std::cout << (*p.getPointer()).at(0);
    }
    

    这当然没有实际用途,而只是std 迭代器的一个示例,它确实携带指向其容器的指针,尽管是一个非常特殊的迭代器(例如,递增std::back_insert_iterator 是一个noop)。使用迭代器的全部意义在于不知道元素来自哪里。另一方面,如果您想要一个迭代器来获取指向容器的指针,您可以编写一个。

    【讨论】:

      猜你喜欢
      • 2011-07-08
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 2011-12-18
      相关资源
      最近更新 更多