【问题标题】:Iterator over 2d vector class member二维向量类成员的迭代器
【发布时间】:2019-01-16 15:08:27
【问题描述】:

我有一个二维向量,它是一个类成员。

std::vector<std::vector<int>> myvec;

无论如何,我可以有一个迭代器作为公共类成员迭代整个行和列吗?然后我可以用它从向量中获取元素。

如果向量有 3 行 4 列,我可以通过使用 iterator+5 来访问 myvec[1][1] 的 5 个元素?

而且,这在某种程度上类似于 C# 中的 IEnumerable 中的 GetEnumerator() 吗? 谢谢

【问题讨论】:

  • 你可以使用 C 风格的索引。由于内存是为向量连续分配的
  • @yadhu 不适用于嵌套向量。
  • IEnumerable&lt;IEnumerable&lt;T&gt;&gt; 也无法使用类似的方法 AFAIK 访问。
  • @appleapple 我认为他们可以,比如这里:public IEnumerator&lt;T&gt; GetEnumerator() { int i = 0; foreach (var block in _list) foreach (var e in block) if (i++ &lt; Count) yield return e; else yield break; } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
  • @mawahballah 您可以编写自己的自定义迭代器类型。但它不会像在 C# 中创建 IEnumerable 那样容易编写。此外,一个好的向量迭代器应该是一个随机访问迭代器,而 IEnumerable 不是

标签: c++ iterator 2d-vector


【解决方案1】:

使用Range-v3,您可以这样做:

std::vector<std::vector<int>> v{{1, 2, 3}, {4, 5}, {6, 7, 8, 9}};

for (auto e : ranges::view::join(v)) {
    std::cout << e << std::endl;
}

Demo

【讨论】:

  • 这个支持it+5吗?
  • 我不这么认为,但肯定是std::next(it, 5)
猜你喜欢
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多