许多标准库容器都具有接受迭代器指定范围的操作。例如,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
现在假设有效范围是什么,我们如何检查范围是否有效?
我想出了一个辅助函数,用于检查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;
}
这不是很方便,因为除了指定范围的迭代器之外,你必须将迭代器传递给容器的末尾。
这是对的吗?有更好的方法吗?
答案 0 :(得分:7)
我们如何检查范围是否有效?
你做不到。您的函数不能保证范围有效,只能从最后一个可以到达。这是两个不同的事情(对于一个简单的例子,考虑将迭代器转换为随后重新分配的向量)。标准没有允许您检查范围是否有效的机制。就像你在取消引用之前无法知道指针有效一样。
请注意,Microsoft提供了一个函数来检查指针是否有效,并且完全搞砸了所有使用指针的人。雷蒙德陈说它应该被命名为CorruptMemoryIfPossible。