gpt4 book ai didi

c++ - 反向迭代 vector

转载 作者:IT老高 更新时间:2023-10-28 12:38:41 29 4
gpt4 key购买 nike

我需要从头到尾遍历一个 vector 。 “正确”的方式是

for(std::vector<SomeT>::reverse_iterator rit = v.rbegin(); rit != v.rend(); ++rit)
{
//do Something
}

//do Something涉及到知道实际的index,那么就需要用rit做一些计算来得到它,比如index = v.size () - 1 - (rit - v.rbegin)

如果无论如何都需要索引,那么我坚信使用该索引进行迭代会更好

for(int i = v.size() - 1; i >= 0; --i)
{
//do something with v[i] and i;
}

这会发出警告,提示 i 已签名,而 v.size() 未签名。改为

for(unsigned i = v.size() - 1; i >= 0; --i) 只是功能错误,因为这本质上是一个无限循环 :)

什么是做我想做的事的美学上的好方法

  • 没有警告
  • 不涉及类型转换
  • 不过分冗长

最佳答案

正如您所指出的,i >= 0 条件在无符号时的问题在于条件始终为真。不要在初始化 i 时减去 1,然后在每次迭代后再次减去 1,而是在检查循环条件后减去 1:

for (unsigned i = v.size(); i-- > 0; )

我喜欢这种风格有几个原因:

  • 虽然 i 会在循环结束时回绕到 UINT_MAX,但它并不依赖这种行为——它会起作用如果类型已签名,则相同。对我来说,依赖未签名的环绕有点像 hack。
  • 它只调用一次size()
  • 它不使用 >=。每当我在 for 循环中看到该运算符时,我都必须重新阅读它以确保没有错误。
  • 如果更改条件中的间距,可以使其使用 "goes to" operator .

关于c++ - 反向迭代 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4205720/

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