我是靠谱客的博主 怕黑万宝路,最近开发中收集的这篇文章主要介绍for auto与iterator使用的区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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使用的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部