for auto与iterator使用的区别

4 篇文章 0 订阅

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值