【问题标题】:What to use as end() iterator C++?什么用作 end() 迭代器 C++?
【发布时间】:2017-06-05 10:34:56
【问题描述】:

我创建了一个指向某个称为元素的结构的指针数组。因此,在我制作表格后** 我只需将数组中的每个指针设置为空指针,然后再添加元素。现在,当我迭代时,我无法将 end() 设置为空指针,因为这样它将在数组中的第一个空指针处停止迭代,并且在该空指针之后找不到潜在元素。

这就是我在开头使用 nullptr 创建和填充数组的方式:

table** = new element*[max_sz+1];
for(size_t i = 0; i <= max_sz; i++) table[i] = nullptr;

我的开始迭代器是第一个元素*,它不是表中的 nullptr。

那么我应该把它设置成什么?有任何想法吗 ?

【问题讨论】:

  • 这里没有迭代器...table** = new element*[max_sz+1]; - 语法无效。
  • 非空元素之后的第一个 nullptr 元素似乎是一个不错的候选者。
  • 用双指针数组来做?!为什么不改为std::vector&lt;std::unique_ptr&lt;element&gt;&gt;?您可以获得 RAII 和可为空的元素,而不会混淆 end()
  • 那么你必须遍历整个数组才能找到所有非空元素。这意味着(使用您当前的代码)“结束迭代器”是table + max_sz + 1
  • @MilosJovanovic 对我和我的编译器来说似乎也是无效的语法:coliru.stacked-crooked.com/a/fd05d3e78fc3f723

标签: c++ iterator nullptr


【解决方案1】:

table + max_sz +1 在您的情况下将是一个合适的结束迭代器(从某种意义上说,迭代器是指针概念的概括)。

例如;

 int *begin = table;
 int *end = table + max_sz + 1;

 for (int *i = begin; i != end; ++i)
 {
       //    whatever
 }

该语言的一个规则是指向数组末尾的指针是有效的(只要该指针未被取消引用)。这是真的,但是数组是创建的(例如,作为静态的、自动存储持续时间的或动态创建的)。

请记住,如果将数组作为参数传递给函数,则会将其转换为指针 - 并且需要单独传递长度信息。

最好使用标准容器(例如std::vector&lt;element&gt;,或者,如果需要动态创建元素,std::vector&lt;std::unique_ptr&lt;element&gt; &gt;)而不是任何涉及原始指针的东西。既是为了便于获取迭代器(如果需要),也是出于其他原因。

【讨论】:

  • 评估table[max_sz + 1] 的行为给出了未定义的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 2015-01-18
  • 2011-01-19
  • 2011-03-29
相关资源
最近更新 更多