C++中循環中的auto是利用了迭代器的機制嗎?
我在練習《C++ primer》上的例子。以下的代碼只是大致說明以下關係。
class A
{
friend class B;
private:
set& b;
};
class B
{
friend class A;
private:
set& a;
};
之後在遍歷A中的set時,用的是for(auto i:b) {}。循環體中對B中的set進行了erase操作。當第二次循環時,就提示,map/set iterator not incrementable.
請問:1.for(auto i:b)中是用了迭代器那種機制嗎?2.如果是用了迭代器,那我的erase操作可能造成的也只是B中的set重新分配地址,而不是A中的set重新分配地址,所以迭代器應該不會失效啊。
題主可以自己寫一個類,比如class haha,然後先不提供begin()、end()、operator++的重載,這時候用for (auto it : haha)的話會提示你需要這些函數,所以1、是的另外在基於範圍的for循環中最好不要進行插入或刪除之類可能會影響迭代器的操作,不然有可能會biu的一下就爆炸了(誤刪除的話改用while循環這種方便控制步長改變的,比如
std::set&
auto it = haha.begin();
while (it != haha.end())
{
if (*it % 2 == 0)
haha.erase(it++);
else
++it;
}
for (auto i : b) Fuck(i);
是
for (auto bitch = std::begin(b); bitch != std::end(b); bitch++)
{
Fuck(*bitch);
}
的縮寫
今天寫代碼遇到這個坑 來強答一下auto用冒號進行遍歷的時候 應該是按值傳遞 拷貝了一份map的一個Key-Value 這時無法對map內的數值進行操作更改
而用auto iter = map.begin()時 等於迭代器使用 這時可以更改容器
以下為參考代碼int main(){ std::map&Data.insert(make_pair(1, 1));
for (auto iter:Data) { iter.second = 5;//這裡不會修改map的值}
for (auto iter = Data.begin(); iter != Data.end(); iter++) { iter-&>second = 5;//這裡map內的值會變成5 }////更新 其實也可以傳引用進去修改for (auto iter:Data){iter.second = 5;//這裡map內的值會變成5} system("pause"); return 0;}vczh 的回答不準確,我樓上的匿名用戶的回答很好
for (auto beg = c.begin(), end = c.end(); beg != end; ++beg){ ....}
推薦閱讀:
※codeblocks寫代碼有時候會自動補全,有時候不補全?
※在輪子哥的 UnitTest.h 當中這段代碼是什麼意思?
※如何解決光線跟蹤中浮點數誤差導致的渲染錯誤?
※c++里有沒有類似python中list的結構?
TAG:C |