/**
* @file
* @author jUicE_g2R(qq:3406291309)
* 通信与信息专业大二在读
* @brief C++迭代器iterator
* @copyright 2023.10
* @COPYRIGHT 原创技术笔记:转载需获得博主本人同意,且需标明转载源
* @language C++
*/
1 迭代器 i t e r a t o r 迭代器iterator 迭代器iterator 在 容器 v e c t o r 容器vector 容器vector 中的使用
迭代器 i t e r a t o r 迭代器iterator 迭代器iterator 一般使用在 容器 v e c t o r 容器vector 容器vector 的 遍历 遍历 遍历,充当 遍历指针 遍历指针 遍历指针 的作用
int main(int* argc, char* argv[]) {
vector<int> num{ 1,2,3 };
vector<int>::iterator It; //正向迭代器
vector<int>::reverse_iterator rIt; //反向迭代器
for (It = num.begin(); It < num.end(); It++) { //正向遍历整个容器
//for (It = num.begin(); It != num.end(); It++)
cout << *It; //将指针解引用得到所指对象的值
}
for (rIt = a.rbegin(); rIt != a.rend(); rIt++) {//反向遍历整个容器
cout << *rIt;
}
return 0;
}
2 迭代器 i t e r a t o r 迭代器iterator 迭代器iterator 在 结构体数组 s t r u c t 结构体数组struct 结构体数组struct 中的使用
typedef struct Student {
int id;
string name;
} stu, * pStu;
vector<stu> S;
int main(int* argc, char* argv[]) {
stu tempS;
tempS.id = 1;
tempS.name = "jUicE";
S.push_back(tempS);
tempS.id = 2;
tempS.name = "g2R";
S.push_back(tempS);
vector<stu>::iterator sIt = S.begin() + 1;//指向第二个元素
cout << (*sIt).name << endl;
cout << sIt->name << endl;
return 0;
}
3 c o n s t const const i t e r a t o r iterator iterator
const iterator cIt;
3-1 性质
c
I
t
cIt
cIt 这个
迭代器(指针)
迭代器(指针)
迭代器(指针) 的 指向对象 的 值 不能通过
c
I
t
cIt
cIt 这个指针 来修改,而
c
I
t
cIt
cIt 的 指向对象 可以改变,与 const char* ch
和 char const* ch
性质相同
3-2 适用场合
- 容器 v e c t o r 容器vector 容器vector 中的元素值不允许被迭代器改写
- 容器 v e c t o r 容器vector 容器vector 被 c o n s t const const 限制 时,对应的迭代器也必须是 c o n s t const const i t e r a t o r iterator iterator
3-3 c b e g i n ( ) cbegin() cbegin() 与 c e n d ( ) cend() cend()
for(auto cIt = num.cbegin(); cIt != num.cend(); cIt++)
c b e g i n ( ) cbegin() cbegin() 与 c e n d ( ) cend() cend() 限制了 迭代器 迭代器 迭代器 的种类只能是 c o n s t 型 const型 const型
4 i t e r a t o r iterator iterator 在 f o r for for 语句中的缺陷
4-1 错误展示
i t e r a t o r iterator iterator 在 f o r for for 语句中,决不允许在 f o r 语句 for语句 for语句 遍历期间,对 容器 v e c t o r 容器vector 容器vector 进行增删元素
for (It = num.begin(); It < num.end(); It++) { //正向遍历整个容器
num.emplace_back(4); //num.push_back(4) 也行
cout << *It; //将指针解引用得到所指对象的值
}
for (val : num) { //正向遍历整个容器
num.emplace_back(4); //num.push_back(4) 也行
cout << val; //将指针解引用得到所指对象的值
}
上面两种都会导致 程序崩溃 程序崩溃 程序崩溃!!!
4-2 解决办法
非要在 遍历期间 遍历期间 遍历期间 增删的话,也只能在增删后,立马 b r e a k break break 出来,然后重新遍历
for (It = num.begin(); It < num.end(); It++) { //正向遍历整个容器
if(...){
num.emplace_back(4); //num.push_back(4) 也行
break;
}
}
for (It = num.begin(); It < num.end(); It++) { //正向遍历整个容器
...
}