gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:51:45 25 4
gpt4 key购买 nike

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

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

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

例如:

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

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

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

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

这不是很方便,因为除了指定范围的迭代器之外,您还必须向其传递一个到容器末尾的迭代器。

这是正确的吗?有更好的方法吗?

最佳答案

how can we check if a range is valid?

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

需要注意的是,微软提供了一个函数来检查指针是否有效,但它彻底搞砸了所有使用它的人。 Raymond Chen 说它应该被命名为 CorruptMemoryIfPossible。

关于c++ - 如何检查迭代器指定的范围是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18266349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com