matlab指定的数据范围无效,c – 如何检查迭代器指定的范围是否有效?

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

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

那么什么是有效范围?我认为这意味着它首先出现在容器中,或者等于容器中的最后一个,因为当我尝试其他方式时(即首先出现在最后),程序的执行将会挂起.

例如:

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

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

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

我想出了一个辅助函数,它检查在到达容器末尾之前是否始终等于last.如果是真的,这是一个强有力的保证,首先不会在最后,因此范围是有效的.

template

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?

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

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

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

来源: https://codeday.me/bug/20190728/1566193.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值