標籤:

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& haha { 1,2,3,4,5 };

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;

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 |