标签:安全 字符串 头文件 区分 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;
}
标签:安全 字符串 头文件 区分 for r++ ptr size 理解
原文地址:https://www.cnblogs.com/cy2837/p/12203404.html