如何检查迭代器指定的范围是否有效?

时间:2013-08-16 05:24:17

标签: c++ iterator c++-standard-library

许多标准库容器都具有接受迭代器指定范围的操作。例如,std::list::assign(InputIterator first, InputIterator last)

但是因为许多这些操作不会抛出异常,如果[first,last)指定的范围无效,则会导致未定义的行为。

那么有效范围?我认为这意味着first在容器中之前或等于last,因为当我尝试其他方式时(即firstlast之后),程序的执行将会挂起。

例如:

std::list.assign(container.begin(), container.end()); // valid range
std::list.assign(container.end(), container.begin()); // invalid range

现在假设有效范围是什么,我们如何检查范围是否有效?

我想出了一个辅助函数,用于检查first在到达容器末尾之前是否等于last。如果为true,则强有力地保证first之后last不会出现,因此范围有效。

template <typename Iterator>
bool isValidRange(Iterator first, Iterator last, Iterator end)
{
  for (; first != end; ++first)
    if (first == last) return true;
  return false;
}

这不是很方便,因为除了指定范围的迭代器之外,你必须将迭代器传递给容器的末尾。

这是对的吗?有更好的方法吗?

1 个答案:

答案 0 :(得分:7)

  

我们如何检查范围是否有效?

你做不到。您的函数不能保证范围有效,只能从最后一个可以到达。这是两个不同的事情(对于一个简单的例子,考虑将迭代器转换为随后重新分配的向量)。标准没有允许您检查范围是否有效的机制。就像你在取消引用之前无法知道指针有效一样。

请注意,Microsoft提供了一个函数来检查指针是否有效,并且完全搞砸了所有使用指针的人。雷蒙德陈说它应该被命名为CorruptMemoryIfPossible。