【问题标题】:does exists a stl data structures that "holds" a current element index/pointer?是否存在“保存”当前元素索引/指针的 stl 数据结构?
【发布时间】:2010-10-18 15:46:12
【问题描述】:

我想改进我的 c++ 代码风格,所以我决定我必须深入研究 stl...首先,因为我在实际案例中需要它,我想知道它是否可用某种包含当前索引的容器......

例如,我的意思是一些容器类,我可以使用 next()/prev() 导航,但我也可以询问 让 get() 检索当前的,而不需要将当前索引/指针存储在我自己的类成员中

(已经看过 stl vector/deque ,希望我没有仔细阅读文档)

【问题讨论】:

  • 3 个答案中的 2 个以“如果我正确理解您的问题”开头。这是需要考虑的事情:)
  • 对不起,我绝对需要英语老师:)
  • 谢谢大家,现在更清楚解决问题的 stl 方法是什么,我将使用迭代器

标签: c++ stl


【解决方案1】:

听起来你想要iterator

迭代器与容器一起使用。它充当指向容器中某个位置的指针,您可以递增(下一个)和递减(上一个)它。

【讨论】:

  • 所以你建议改为将它用于循环我应该在我的类中声明一个迭代器作为成员,例如 vector::iterator my_it 并让它也保持当前位置......是吗听起来正确吗?
  • @luca:对于一个向量来说可能不是一个好主意,它的迭代器很容易失效(迭代器只不过是一个指向向量分配数组的指针,随着它的增长它可能会移动到其他地方)。为什么不简单地存储索引?
  • @UncleBens:存储索引不会有同样的责任吗?就像迭代器一样,在插入或删除后它会变得无效。
  • 它可能会失效,但不像向量迭代器那么容易。即使在push_back 之后,第 3 项仍然是第 3 项。
  • @UncleBens:除非我弄错了,否则push_back 不会使迭代器无效(end() 处的迭代器除外)。就像你说的,第 3 项仍然是第 3 项;指向它的迭代器应该和指针一样工作。我错过了什么吗?
【解决方案2】:

是的,如果我正确理解您的问题,您想研究迭代器。这是一个例子:

std::vector<int> someVector;
// add elements to the vector here
// ...
std::vector<int>::iterator start = someVector.begin();
std::vector<int>::iterator end = someVector.end();
while(start != end)
{
    std::cout << *start << std::endl;
    ++start;
}

它们的行为类似于指针,所有 stl 容器都有迭代器。请注意,存在不同类型的迭代器(反向、常量、双向、正向、随机访问等),并且它们具有不同的可用操作。

【讨论】:

    【解决方案3】:

    如果我正确理解您的需求,那么不,没有 stl 容器可以将迭代器存储到某种当前元素。但是我不明白为什么您不愿意自己存储该迭代器?像这样:

    ContainerType cont;
    ContainerType::iterator current;
    

    现在你可以做++current;--current(如果容器有双向迭代器);和*current

    【讨论】:

      【解决方案4】:

      简短的回答是否定的。标准容器的一个基本设计原则是将迭代与容器分开——也就是说,您总是需要一个单独的迭代器来跟踪任何给定容器中的当前“点”。

      将包含与迭代相结合的容器在旧设计中很常见,但这使得代码的不同部分几乎不可能同时迭代特定容器。

      【讨论】:

      • 好点,谢谢“.. 但这使得代码的不同部分几乎不可能同时遍历特定容器....”
      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多