概述
auto和iterator与for循环合作,都可以访问STL的容器,下面总结一下它们的使用注意点:
首先这里声明一个multimap<int, int> multiTest;
1、当以for(auto it: multiTest)方式访问multiTest时,此时auto it变量访问的是mutlTest的形参,所以并没有真正修改mutlTest
2、当以for(auto& it: multiTest)方式访问multiTest时,此时auto it变量是引用参数,操作的是真正的multiTest,所以修改值是有效的
3、当使用for(auto it = multiTest.begin(); it != multiTest.end(); it++)这种方式操作时,it其实就是iterator,此时修改multiTest是有效的
4、当直接使用for(multimap<int,int>::itereator it = multiTest.begin(); it != multiTest.end(); it++) 时,it是iterator,修改multiTest是有效的
5、当以for(auto it:multiTest) 和for(auto& it:multiTest)操作STL容器时,it访问STL元素时应该这样: it.first;
6、当以iterator方式访问STL容器时,应当使用->符号访问元素,例如it->first
下面举个栗子:
#include <iostream>
#include <map>
using namespace std;
int main()
{
//第一个元素是用户Id,第二个元素是该用户Id下的任务数量
multimap<int, int> multiTest;//int userId, int taskCount
//为multiTest赋值
multiTest.insert(multimap<int, int>::value_type(1,0));
multiTest.insert(multimap<int, int>::value_type(1,1));
multiTest.insert(multimap<int, int>::value_type(1,2));
multiTest.insert(multimap<int, int>::value_type(2,0));
multiTest.insert(multimap<int, int>::value_type(2,1));
multiTest.insert(multimap<int, int>::value_type(2,2));
//使用iterator时,访问multimap的元素时需要使用->符号
for(multimap<int, int>::iterator it = multiTest.begin(); it != multiTest.end(); it++)
{
cout << "iterator:(" << it->first << "," << it->second << ")" << endl;
}
//使用auto it指向multimap的首元素时,it其实就是iterator,访问multimap的元素时需要使用->符号
for(auto it = multiTest.begin(); it != multiTest.end(); it++)
{
cout << "auto it iterator:("<< it->first << "," << it->second << ")" << endl;
}
//当for 与 auto结合使用指向STL容器时,访问multimap的元素时需要使用.符号
for(auto it : multiTest)
{
cout << "auto it:("<< it.first << "," << it.second << ")" << endl;
}
//auto赋值后元素暂时的值
cout << "auto做索引,value值乘以2以后,for循环结束时,multimap值未修改,因为auto只是一个形参" << endl;
for(auto it: multiTest)
{
it.second = it.second*2;
}
for(auto it : multiTest)
{
cout << "(" << it.first << "," << it.second << ")" << endl;
}
//auto&赋值后元素暂时的值
cout << "auto& 做索引,value值乘以2以后,for循环结束时,multimap值修改成功,因为auto是引用参数" << endl;
for(auto& it: multiTest)
{
it.second = it.second*2;
}
for(auto it : multiTest)
{
cout << "(" << it.first << "," << it.second << ")" << endl;
}
//使用iterator对STL元素的值做操作是真实有效的
cout << "auto做iterator,value值乘以2以后,for循环结束时,multmap值修改成功,iterator操作成功" << endl;
for(auto it = multiTest.begin(); it != multiTest.end(); it++)
{
it->second = it->second*2;
}
for(auto it : multiTest)
{
cout << "(" << it.first << "," << it.second << ")" << endl;
}
//multimap的find()函数返回第一个匹配的键值对
auto it = multiTest.find(2);
cout << "find (" << it->first << ":" << it->second << ")" << endl;
//multimap的count()函数返回查找key值为1的键值对个数
cout << "multiTest.count(1)=" << multiTest.count(1) << endl;
return 0;
}
输出结果
iterator:(1,0)
iterator:(1,1)
iterator:(1,2)
iterator:(2,0)
iterator:(2,1)
iterator:(2,2)
auto it iterator:(1,0)
auto it iterator:(1,1)
auto it iterator:(1,2)
auto it iterator:(2,0)
auto it iterator:(2,1)
auto it iterator:(2,2)
auto it:(1,0)
auto it:(1,1)
auto it:(1,2)
auto it:(2,0)
auto it:(2,1)
auto it:(2,2)
auto做索引,value值乘以2以后,for循环结束时,multimap值未修改,因为auto只是一个形参
(1,0)
(1,1)
(1,2)
(2,0)
(2,1)
(2,2)
auto& 做索引,value值乘以2以后,for循环结束时,multimap值修改成功,因为auto是引用参数
(1,0)
(1,2)
(1,4)
(2,0)
(2,2)
(2,4)
auto做iterator,value值乘以2以后,for循环结束时,multmap值修改成功,iterator操作成功
(1,0)
(1,4)
(1,8)
(2,0)
(2,4)
(2,8)
find (2:0)
multiTest.count(1)=3
最后
以上就是怕黑万宝路为你收集整理的for auto与iterator使用的区别的全部内容,希望文章能够帮你解决for auto与iterator使用的区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复