C++中的迭代器简介

时间:2020-02-23 14:30:00  来源:igfitidea点击:

在本文中,我们将详细了解C++中的迭代器。
在使用数据元素时,我们经常遇到需要遍历数据结构的每个元素的情况。
为了达到目的,C++为我们提供了迭代器。

迭代器基本上是"对象",可帮助程序员访问容器中的数据项。
它指向标准模板库容器的特定索引位置(内存地址),并允许访问该位置的数据项。

语法:

container-name<data-type>::iterator iterator-name;

例:

list<int>::iterator A;

因此,迭代器可帮助我们在容器中移动和遍历。

C++中的迭代器类型

在初始阶段,迭代器和指针在功能上可能与您相似。
但是,在本教程结束时,您将了解C++中的Iterator和Pointer之间的区别。

迭代器的工作方式与指针不同。
以下是完全提供不同功能的迭代器的类型:

  • 输入迭代器
  • 输出迭代器
  • 正向迭代器
  • 双向迭代器
  • 随机访问迭代器

1.输入迭代器

输入迭代器是迭代器的基本类型,其唯一目的是"遍历"容器的元素。

它可以帮助我们遍历容器的各个元素,但不能为我们提供修改容器数据值的访问权限。

以下是可与输入迭代器一起使用的运算符的列表:

  • 解引用运算符(*)
  • 增量运算符(++)
  • 等于运算符(==)
  • 不等于运算符(!=)

例:

#include <iostream> 
#include <list> 
using namespace std; 
int main() 
{ 
	list<int> li= { 10, 20, 42, 50, 75 }; 

	list<int>::iterator x; 
	cout<<"Traversing elements of the list.."<<endl;

	for (x = li.begin(); x != li.end(); x++) { 
		
		cout << (*x) << " "; 
	} 
	return 0; 
} 

在上面的代码片段中,我们使用了一个列表作为容器,并声明了" x"作为该列表" li"的迭代器。
" begin()"和" end()"函数用于指向容器的第一个和最后一个位置。
迭代器以向前(升序)的方式遍历列表。

输出:

Traversing elements of the list..
10 20 42 50 75 

我们将在本文的后续部分中了解有关这些操作的更多信息。

2.输出迭代器

输出迭代器与输入迭代器是"互补的",即在功能上彼此相反。

它们可用于分配和操作容器数据项的值。
但是,它们不能用于访问或者遍历容器的元素。

以下是可与输出迭代器一起使用的运算符的列表:

  • 解引用运算符(*,->)
  • 增量运算符(++)
  • 等于运算符(==)
  • 不等于运算符(!=)

例:

#include <iostream> 
#include <list> 
using namespace std; 
int main() 
{ 
	list<int> li= { 10, 20, 42, 50, 75 }; 

	list<int>::iterator x; 
	cout<<"Traversing elements of the list.."<<endl;

	for (x = li.begin(); x != li.end(); x++) { 
//using output iterator to change or assign new values to all the
//elements of the list
		*x = 4;
	} 
	for (x = li.begin(); x != li.end(); x++) { 
//using input iterator to traverse the list
		cout << (*x) << " "; 
	} 
	
	return 0; 
} 

如上所示,我们已使用输出迭代器将value = 4分配给了容器的所有元素。

输出:

Traversing elements of the list..
4 4 4 4 4 

3.双向迭代器

双向迭代器与输入迭代器非常相似。
唯一的区别是双向迭代器可以在两个方向(即"前进和后退(反向)"方向)上遍历元素。

以下是可与输入迭代器一起使用的运算符的列表:

  • 解引用运算符(*,->)
  • 增量运算符(++)
  • 等于运算符(==)
  • 不等于运算符(!=)
  • 减量运算符(–)

例:

#include <iostream> 
#include <list> 
using namespace std; 
int main() 
{ 
	list<int> li= { 10, 20, 42, 50, 75 }; 

	list<int>::iterator x; 
	cout<<"Traversing elements of the list in forward direction.."<<endl;

	
	for (x = li.begin(); x != li.end(); x++) { 
//using input iterator to traverse the list
		cout << (*x) << " "; 
	} 
cout<<endl;
	cout<<"Traversing elements of the list in backward direction.."<<endl;

for (x=li.end();x!=li.begin();--x) 
	{ 
		if (x != li.end()) 
		{ 
			cout << (*x) << " "; 
		} 
	} 
	cout << (*x); 
	
	return 0; 
} 

输出:

Traversing elements of the list in forward direction..
10 20 42 50 75 
Traversing elements of the list in backward direction..
75 50 42 20 10

4.转发迭代器

正向迭代器可以分别称为输入和输出迭代器的组合。
它允许我们"修改"容器数据项的值以及"遍历"容器的元素。

但是,与双向迭代器不同,前向迭代器不允许反向或者向后遍历元素。

以下是可与输入迭代器一起使用的运算符的列表:

  • 解引用运算符(*,->)
  • 增量运算符(++)
  • 等于运算符(==)
  • 不等于运算符(!=)

例:

#include <iostream> 
#include <list> 
using namespace std; 
int main() 
{ 
	list<int> li= { 10, 20, 42, 50, 75 }; 

	list<int>::iterator x; 
	cout<<"Traversing elements of the list.."<<endl;
for (x = li.begin(); x != li.end(); ++x) { 
		
		cout << (*x) << " "; //using input iterator to traverse the list
	} 
	

	for (x = li.begin(); x != li.end(); x++) {
//using output iterator to change or assign new values to all the 
//elements of the list
                *x = 4;	
	} 
cout<<endl;
cout<<"Traversing elements of the list after assigning a new value to the list.."<<endl;
	for (x = li.begin(); x != li.end(); ++x) { 
		
		cout << (*x) << " "; //using input iterator to traverse the list
	} 
	
	return 0; 
} 

输出:

Traversing elements of the list..
10 20 42 50 75 
Traversing elements of the list after assigning a new value to the list..
4 4 4 4 4 

5.随机访问迭代器

随机访问迭代器使用户可以在容器中的任何随机索引/位置访问数据项。
此外,它包含双向容器的所有属性。

此外,为了随机访问数据项,随机访问迭代器可以访问指针减法和加法。

C++中迭代器执行的操作

以下是一些通过迭代器操作数据项的基本且最常用的功能:

  • begin():此方法返回容器中数据项的开始/开始索引。

  • end():返回容器中数据项的结束索引。

  • prev(int):返回一个新的迭代器,该迭代器指向位于函数参数中提到的位置之前的数据项。

  • next(int):它返回一个新的迭代器,该迭代器指向位于函数参数中提到的位置之后的数据项。

  • inserter(container,int):此函数在容器中的指定索引或者位置添加/插入一个值。

  • advance(int):它以参数中指定的数字递增,并指向该索引处指定的数据元素。

例:

#include <iostream> 
#include <list> 
using namespace std; 
int main() 
{ 
	list<int> li= {10, 20, 42, 50, 75}; 
	list<int>::iterator x; 

	cout<<"Traversing elements of the list in forward direction.."<<endl;

	
	for (x = li.begin(); x != li.end(); x++) { 
		
		cout << (*x) << " "; //using input iterator to traverse the list
	} 
  cout<<endl;

list<int>::iterator ee = li.begin(); 
    
  advance(ee, 3); 
  cout << "The element pointed by the iterator after using advance(): "; 
  cout << *ee << " "; 
cout<<endl;
list<int>::iterator A = li.begin(); 
list<int>::iterator B = li.end(); 
   
 auto aa = next(A, 2); 
    
  
 auto  bb = prev(B, 2); 

 cout << "Element pointed using next() is : "; 
  cout << *aa << " "; 
  cout << endl; 
    
  cout << "Element pointed using prev()  is : "; 
  cout << *bb << " "; 
  cout << endl; 
	
	return 0; 
} 

输出:

Traversing elements of the list in forward direction..
10 20 42 50 75 
The element pointed by the iterator after using advance(): 50 
Element pointed using next() is : 42 
Element pointed using prev()  is : 50 

C++中迭代器的优点

  • "易于编程":在迭代器的帮助下,我们无需考虑容器大小的变化,因此可以使用begin()和end()方法轻松遍历容器。

  • 高级别的"代码可重用性"。

  • 动态地从容器中添加或者删除数据元素。