【问题标题】:Iterator pointing to empty element of array指向数组空元素的迭代器
【发布时间】:2018-08-02 07:42:45
【问题描述】:

我只是想知道是否在一个有元素但没有充满元素的数组中,例如:

std::array<int, 5> foo;
foo[0] = 4;
foo[1] = 2;
foo[2] = 3;

foo.end() 会仍然指向最后一个元素 + 1 还是会指向 foo[3] 处的值?

我的上下文是我试图找到一个数组的最小值位置,该数组有时只分配了所有元素。部分示例代码如下:

int min_loc = std::min_element(foo.begin(), foo.end()) - foo.begin();

这会提取 min_loc = 1 吗?或者它会在数组中未定义的元素处找到 0 并将其分配为最小位置?

如果是这样,我应该将上面的行定义为:

int min_loc = std::min_element(foo.begin(), foo.end() - 2) - foo.begin();

提前致谢。

【问题讨论】:

  • foo 中没有漏洞。您尚未分配的元素仍然存在,它们只是未初始化,包含随机垃圾。 foo.end() 仍然指向 foo[4] 过去一格。您的第一个 std::min_element 调用通过访问未初始化的对象表现出未定义的行为。
  • 好的,非常感谢!

标签: arrays c++11 iterator min


【解决方案1】:

解决方案 1

用 std::numeric_limits::max() 填充数组中的所有元素

解决方案 2:

如果您不知道数组的大小,请使用动态大小的容器 => 向量:

std::vector<int> foo;
foo.push_back(4);
foo.push_back(2);
foo.push_back(3);

int min_loc = std::distance(std::begin(v), std::min_element(std::begin(v), std::end(v)));

【讨论】:

  • 谢谢,虽然我的首要任务是性能,因此有一个静态大小的数组(它可以传递多个函数),可能比未知的向量大小更好?认为这样做对我来说会更便宜:foo.begin() + array_offset 作为第二个限制。
  • @A.Lillystone 对数组的引用并不比对向量的引用更容易传递。根据数据的稀疏程度,vectors 的副本可能比arrays 的副本更快。鉴于此,您的最高优先级应该是正确性,因为int main() { return 0; } 将击败您当前程序在性能方面的任何表现
猜你喜欢
  • 1970-01-01
  • 2014-04-22
  • 2016-03-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
相关资源
最近更新 更多