C++ 笔记 迭代器简单记录
基础用法:
#include <vector>
#include <string>
using namespace std;
int main(){
//常用基本方法
vector <double> str_test1{10,1.1};
//定义迭代器
vector <double>::iterator iter;
//容器迭代器
//返回一个begin迭代器 指向第一个元素
iter = str_test1.begin();
//指向末端 可以理解为最后一个元素+1
iter = str_test1.end();
//需要注意的是如果迭代器里面没有值则begin和end返回类型相同
return 0;
}
例1:容器基本遍历
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
vector <int> str_test1{1,2,3,4,5,6,7,8,9,10};
for (auto iter = str_test1.begin(); iter != str_test1.end(); iter++) {
cout << *iter << endl;
}
return 0;
}
结果:
反向迭代:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
vector <int> str_test1{1,2,3,4,5,6,7,8,9,10};
for (auto iter = str_test1.rbegin(); iter != str_test1.rend(); iter++) {
cout << *iter << endl;
}
return 0;
}
结果:
注意:不能迭代一个空的容器
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
vector <int> str_test1{};
auto iter = str_test1.begin();
iter++;
return 0;
}
或者:当容器已经指向end时就不能继续往后进行运算
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
vector <int> str_test1{};
auto iter = str_test1.end();
iter++;
return 0;
}
导致程序发生崩溃或者不可预测的事情:
迭代器的比较:
当迭代器都同时指向同一个位置后则为true否则则为flase。
常量迭代器:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
vector <int> str_test1{1,2,3};
vector <int>::const_iterator iter;
iter = str_test1.begin();
return 0;
}
注意:常量迭代器是无法修改指向本身的内容但是可以修改指向的方向。如下:
C++11中新引入新方法:cbegin(),cend ()也是返回常量迭代器。
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
vector <int> str_test1{1,2,3};
vector <int>::const_iterator iter;
iter = str_test1.cbegin();
iter = str_test1.cend ();
return 0;
}
迭代器中经典灾难场景:
场景1:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
vector <int> str_test1{1,2,3};
for (auto itme : str_test1) {
str_test1.push_back(1);
cout << itme << endl;
}
return 0;
}
当在迭代过程中同时又往里添加新的元素导致里面的元素都发生意想不到的情况。
场景2:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
vector <int> str_test1{1,2,3};
for (auto itme = str_test1.begin(), end=str_test1.end(); itme!=end;itme++){
str_test1.push_back(1);
cout << *itme << endl;
}
return 0;
}
也是在迭代过程中同时又往里添加新的元素,这次程序直接崩溃。
小结:在使用迭代器尤其是这种循环结构时是不能修改容器中的大小,否则会导致程序出现问题。非要使用这种写法请在修改后直接break。如图:
场景3:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
vector <int> str_test1{1,2,3};
int count = 0;
auto itme = str_test1.begin();
while (itme != str_test1.end())
{
itme = str_test1.insert(itme,count);
count++;
if (count > 10)
break;
itme++;
}
cout << str_test1.size() << endl;
return 0;
}
如果必须迭代的同时并且修改容易的大小,需要对所有的迭代器位置进行动态刷新,否则还是会让迭代器失效。
场景4:在迭代中删除元素
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
vector <int> str_test1{1,2,3};
int count = 0;
for (auto itme = str_test1.end(); itme != str_test1.begin();itme--) {
str_test1.erase(itme);
}
return 0;
}
解决办法:
在修改过程中需要动态刷新。
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main(){
vector <int> str_test1{1,2,3};
int count = 0;
while (!str_test1.empty())
{
auto itme = str_test1.begin();
str_test1.erase(itme);
}
return 0;
}