许多标准库容器具有接受迭代器指定范围的操作。例如,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
如果为真,这是一个强有力的保证,first
不会出现在后面last
,因此范围是有效的。
template <typename Iterator>
bool isValidRange(Iterator first, Iterator last, Iterator end)
{
for (; first != end; ++first)
if (first == last) return true;
return false;
}
这不是很方便,因为除了指定范围的迭代器之外,您还必须将迭代器传递给容器的末尾。
这个对吗?有一个更好的方法吗?