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

Den*_*nis 4 c++ iterator c++-standard-library

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

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

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

例如:

std::list.assign(container.begin(), container.end()); // valid range
std::list.assign(container.end(), container.begin()); // invalid range
Run Code Online (Sandbox Code Playgroud)

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

我想出了一个辅助函数,它检查在到达容器末尾之前first是否等于last它.如果是真的,这是一个强有力的保证,first因为last范围是有效的.

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

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

它是否正确?有一个更好的方法吗?

Pup*_*ppy 7

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

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

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