码迷,mamicode.com
首页 > 其他好文 > 详细

课时10:迭代器、迭代器失效分析

时间:2020-01-17 16:23:13      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:安全   字符串   头文件   区分   for   r++   ptr   size   理解   

1.迭代器简介
迭代器是一种遍历容器元素的数据类型,这种数据类型类似指针,理解的时候可以理解为迭代器用来指向容器中的某个元素
2.容器的迭代器类型
vector<int> iv ={100,200,300};
vector<int>::iterator iter; //定义迭代器

3.迭代器begin()/end()操作,反向迭代器rbegin()/rend()操作
//begin()/end()用来返回迭代类型,rbegin()/rend()用来返回迭代类型
a.begin()返回一个迭代器类型
iter = iv.begin(); //如果容器中有元素,则begin返回的迭代器指向的是容器中的第一个元素
b.end()返回一个迭代器类型 //end返回的迭代器指向的不是末端元素,而是末端元素的后边。指向的是一个不存在的元素


c.如果一个容器为空,begin()和end()返回的迭代器就相同
d.遍历容器中的元素
//迭代器
vector<int> vec = {1,2,3,4,5,6,7};
for(vector<int>::iterator iter = vec.begin();iter != iter.end();iter++){

cout<<*iter<<endl;
}

//反向迭代器:使用rbegin(),rend():
//rbegin():返回一个反向迭代器,指向反向迭代器的第一个元素;
//rend():返回一个反向迭代器,指向反向迭代器的最后一个元素的后面;
for(auto riter = vec.rbegin();riter != vec.rend();riter++){
cout<<*iter<<endl;
}

4.迭代器运算符
a.*iter :返回迭代器iter所指向元素的引用,必须保证迭代器指向的是有效的容器元素,不能指向end()
b.iter++,++iter :让迭代器指向容器的下一个元素
c.iter--,--iter :指向迭代器中的上一个元素
d.iter1 == iter2,iter1 != iter2.判断两个迭代器是否相等
//如果两个迭代器指向的是同一个元素,就相等,否则就不等
e.自定义类型使用迭代器(如何引用结构中的成员)
struct student{
int num;
}
int main(){
student stu;
stu.num = 10;

vector<student> vstu;
stu.push_back(stu);
vector<student>::iterator iter = vstu.begin();
cout<<(*iter).num<<endl;
cout<<iter->num<<endl;

return 0;

}


5.const_iterator迭代器
//const_iterator迭代器,表示迭代器指向的值不能改变。只能从容器中读元素,不能通过这个迭代器修改容器中的元素
cbegin(),cend();

6.迭代器失效
//在操作迭代器的过程中,千万不要改变vector容器的容量。不要增加或删除vector容器中的元素。
//若一定要改变元素,可以在改变之后直接break

insert(position,value) :position表示插入的位置,value表示插入的值
erase(iter) :移除iter位置上的元素,返回下一个元素位置

//安全释放迭代器中的元素
a.
vector<int>::iterator iter = iv.begin();
while (iter != iv.end){ //iv.end()是一直在变的
iter = iv.erase(iter);

}
-----------------------------------------------------------------
b.
while(!iv.empty()){
auto iter = iv.begin();
iv.erase(iter); //删除该位置上的元素
}
------------------------------------------------------------------

7.范例演示

//vector容器常用操作与内存释放

stricmp()函数:用来比较两个字符串(不区分大小写)
stricmp(s1,s2); ->若两个字符串相等,返回0
注意:stricmp()是Windows下特有的,linux下具有相同功能的函数是strcasecmp(),包含在头文件strings.h下

//conf结构体
struct conf {
char itername[40];
char itervalue[100];
};

//getInfo函数,获取对应值
auto getinfo (vector<conf*> &conflist,const char *piter)->char* {

for (vector<conf*>::iterator iter = conflist.begin(); iter != conflist.end();iter++) {

if (_stricmp((*iter)->itername, piter) == 0) {
return (*iter)->itervalue;
}

}
return nullptr;

};

//主函数
int main() {

conf* conf1 = new conf;
strcpy_s(conf1->itername,sizeof(conf1->itername),"ServerName");
strcpy_s(conf1->itervalue, sizeof(conf1->itervalue), "area one");

conf* conf2 = new conf;
strcpy_s((*conf2).itername,sizeof(conf2->itername),"ServerIp");
strcpy_s(conf2->itervalue, sizeof(conf2->itervalue), "3.1.113.190");

vector<conf*> conflist;
conflist.push_back(conf1);
conflist.push_back(conf2);

char* tmp = getinfo(conflist, "ServerName");

if (tmp != nullptr) {
cout << tmp << endl;

}

//释放内存
for (vector<conf*>::iterator iter = conflist.begin(); iter != conflist.end();iter++) {

delete(*iter); //删除指针

}
conflist.clear();

return 0;

}

课时10:迭代器、迭代器失效分析

标签:安全   字符串   头文件   区分   for   r++   ptr   size   理解   

原文地址:https://www.cnblogs.com/cy2837/p/12203404.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!