- 主题:迭代器为啥不搞个 ! 操作?
这种写法:
for (auto itor = map.cbegin(); itor != map.cend(); ++itor) {}
如果是内置的类型还行,碰到有些复杂的类型,比如我给 lmdb 弄了个迭代器,它的 cbegin() 和 cend() 都特别重,你上面那样写就很浪费时空效率。所以我给迭代器整了一个 operator!(),写起来既简洁又高效:
for (auto itor = lmdb.begin(); !!itor; ++itor) {}
所以为啥 c++ 标准不搞这种写法呢?
--
FROM 59.61.197.*
代码里到处充斥着!!()也很恐怖
--
FROM 114.241.228.*
智能指针,optinaol都有bool操作符,iter没有是因为很多时候不是和end,而是和中间的iter比较啊。
【 在 hgoldfish 的大作中提到: 】
:
: 这种写法:
:
: for (auto itor = map.cbegin(); itor != map.cend(); ++itor) {}
:
#发自zSMTH-v-@OnePlus IN2010
--
FROM 222.129.55.*
没懂。
cend很重,是要每次取值,取的开销大。
!能避免每次取值的需求吗?这是迭代器失效的问题。类似volatile
更麻烦的写法是分两行,先把cend取出来,命名E,再跟E比较。
表明此循环不更改容器。
LLVM的编程guideline见到,这么写的。
【 在 hgoldfish 的大作中提到: 】
: 这种写法:
: for (auto itor = map.cbegin(); itor != map.cend(); ++itor) {}
: 如果是内置的类型还行,碰到有些复杂的类型,比如我给 lmdb 弄了个迭代器,它的 cbegin() 和 cend() 都特别重,你上面那样写就很浪费时空效率。所以我给迭代器整了一个 operator!(),写起来既简洁又高效:
: ...................
--
FROM 61.185.187.*
不写 !!() 直接写 itor 也行。for(; itor; ) 这里本来就会做个 bool 操作。
【 在 z16166 的大作中提到: 】
: 代码里到处充斥着!!()也很恐怖
--
FROM 59.61.197.*
可以把这个 != end() 做个简化呗。也不排斥现有的写法啊。
【 在 ble 的大作中提到: 】
: 智能指针,optinaol都有bool操作符,iter没有是因为很多时候不是和end,而是和中间的iter比较啊。
: #发自zSMTH-v-@OnePlus IN2010
--
FROM 59.61.197.*
这个只对 cend() 有效吧。如果是 end() 的话,因为有可能在迭代循环中间调用了
itor = erase(itor);
此时 end() 也会发生变化啊。而使用 end() 而非 cend() 一般都代表着会对容器做一些改变。
【 在 DoorWay 的大作中提到: 】
: 没懂。
: cend很重,是要每次取值,取的开销大。
: !能避免每次取值的需求吗?这是迭代器失效的问题。类似volatile
: ...................
--
FROM 59.61.197.*
C++里推荐的做法应该是外挂一个全局或namespace的operator!,然后通过traits仅匹配iterator。
【 在 hgoldfish 的大作中提到: 】
: 这种写法:
: for (auto itor = map.cbegin(); itor != map.cend(); ++itor) {}
: 如果是内置的类型还行,碰到有些复杂的类型,比如我给 lmdb 弄了个迭代器,它的 cbegin() 和 cend() 都特别重,你上面那样写就很浪费时空效率。所以我给迭代器整了一个 operator!(),写起来既简洁又高效:
: for (auto itor = lmdb.begin(); !!itor; ++itor) {}
: 所以为啥 c++ 标准不搞这种写法呢?
--
FROM 114.93.62.*