在 C++ 中取消引用迭代器
迭代器是 C++ 中的另一种强大机制,可帮助您迭代复杂的数据结构(例如树)和内部没有元素索引的集合(例如数组)。
C++ 中的迭代器是什么
在 C++ 中,迭代器是一个类似于指针的对象,指向数组、列表和任何其他数据结构中的元素。 我们使用迭代器来迭代容器元素; 尽管我们可以使用传统的循环,但迭代器在遍历容器时具有优势。
它提供了一种非常通用的方法来遍历容器的元素。
在像数组这样的一般数据结构中,我们可以使用索引变量来循环遍历容器,但是在像树或无序数据结构这样的高级数据结构中,我们没有索引变量来循环,我们使用迭代器来遍历它 。
容器向迭代器提供数据类型,容器类提供两个基本函数来帮助迭代器迭代容器的元素。
- Begin() - 它返回容器的第一个元素。
- End() - 它返回容器中最后一个元素的下一个元素。
让我们通过一个正确的代码示例来理解。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
// Declaring a vector
vector<int> numbers = { 1, 2, 3, 4, 5 };
// Declaring an iterator
vector<int>::iterator i;
int j;
cout << "Traversing using loop = ";
// Accessing the elements using loops
for (j = 0; j < 5; ++j){
cout << numbers[j] << ", ";
}
cout <<endl << "Traversing using Iterators = ";
// Accessing the elements using iterators
for (i = numbers.begin(); i != numbers.end(); ++i){
cout << *i << ", ";
}
// Adding another element to the vector
numbers.push_back(6);
cout <<endl << "Traversing using loops after adding new value to numbers = ";
//After adding a new value to the numbers vector
for (j = 0; j < 5; ++j){
cout << numbers[j] << ", ";
}
cout <<endl << "Traversing using iterators after adding new value to numbers = ";
// Accessing the elements using iterators
for (i = numbers.begin(); i != numbers.end(); ++i){
cout << *i << ", ";
}
return 0;
}
输入:
Traversing using loop = 1, 2, 3, 4, 5,
Traversing using Iterators = 1, 2, 3, 4, 5,
Traversing using loops after adding new value to numbers = 1, 2, 3, 4, 5,
Traversing using iterators after adding new value to numbers = 1, 2, 3, 4, 5, 6,
该程序演示了使用循环和迭代器遍历容器的用法之间的差异。 在上面的代码中,迭代器跟踪代码并动态地采用代码中的任何更改。
在循环中,您需要静态更新循环代码。 迭代器正在实现代码可重用性因素。
在迭代器中,begin()
函数获取容器的第一个元素,end()
函数获取最后一个元素的下一个元素。
C++ 中的取消引用
C++ 中的解引用运算符用于访问或操作指针指向的内存位置中的数据。 * 星号与指针变量一起使用,对指针变量进行求差,它引用的是指向变量,这称为指针的解引用。
代码示例:
#include<iostream>
using namespace std;
int main() {
int a = 9, b;
int *p; // Un-initialized Pointer
p = &a; // Store the address of a in pointer p
b = *p; // Put the Value of the pointer p in b
cout<<"The value of a = "<<a<<endl;
cout<<"The value of pointer p = "<<*p<<endl;
cout<<"The value of b = "<<b<<endl;
}
输出:
The value of a = 9
The value of pointer p = 9
The value of b = 9
我们首先将 9 赋给 a,然后定义一个指针 p。 接下来,我们将a的地址分配给p,这是一个指针,最后,我们将指针分配给整数数据类型的变量b。
现在,在显示时,a、p 和 b 得到与 9 相同的输出,因为 p 具有 a 的地址,这有助于我们在任何地方显示 a 的值。
为什么我们不能在 C++ 中取消引用迭代器
在 C++ 中,不能立即取消引用迭代器,因为 end() 函数返回迭代器和对象作为指针,而指针不是数据结构的有效成员。
当您在末尾取消引用时,它会引发错误,因为结束指针的目的只是查看何时到达它。
Begin()返回容器不为空时的位置,换句话说,满足这个条件。
v.begin() != v.end() // this condition checks, if the container is empty or not
但如果您需要访问最后一个元素,可以使用下面的代码。
vector<object>::const_iterator i = vectorOfObjects.end();
i--;
cout << *i << endl; // this prints the last element of the container
提醒一下,此代码仅在向量包含至少一个元素时才有效。
代码示例:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Student {
int roll;
string name;
int age;
};
int main(){
Student s1, s2, s3; // Objects of strucu
vector<Student> ListOfStudents;
s1.roll = 1; //populating the data members of Student
s2.roll = 2;
s3.roll = 3;
s1.name = "Mike";
s2.name = "John";
s3.name = "Tom";
s1.age = 15;
s2.age = 16;
s3.age = 14;
ListOfStudents.push_back(s1);
ListOfStudents.push_back(s2);
ListOfStudents.push_back(s3);
vector<Student>::const_iterator iter = ListOfStudents.begin(); //begining position
while ( iter != ListOfStudents.end()){ // if the container is empty or not
cout << "Roll number " << iter->roll << " is "
<<(*iter).name << " and he is "
<< iter->age << " years old." << endl;
++iter;
}
return 0;
}
输出:
Roll number 1 is Mike and he is 15 years old.
Roll number 2 is John and he is 16 years old.
Roll number 3 is Tom and he is 14 years old.
相关文章
在 C++ 中实现双向链表的迭代器
发布时间:2023/08/28 浏览次数:193 分类:C++
-
由于双向链接数据结构由一组顺序链接的节点组成,其起始节点和结束节点的上一个和下一个链接都指向一个终止符(通常是哨兵节点或空),以方便链表的遍历。 本教程将教您如何在 C++ 中实
用 C++ 编写系统调用
发布时间:2023/08/28 浏览次数:161 分类:C++
-
本文将讨论从 C++ 编写的程序中调用写入系统的方法。 首先,我们将快速刷新系统调用,特别是 write 系统调用及其原型。稍后,我们将讨论从 C++ 程序调用 write 系统调用。
在 C++ 中获取鼠标位置
发布时间:2023/08/28 浏览次数:136 分类:C++
-
本文讲述如何在 C++ 中获取鼠标位置。在 C++ 中获取鼠标位置 C++ 提供了 GetCursorPos 方法来获取鼠标光标的 x 和 y 位置。
C++ 中的多维向量
发布时间:2023/08/28 浏览次数:150 分类:C++
-
这个简短的编程教程是关于 C++ 中多维向量的介绍。 向量是可以像 C++ 中的动态数组一样存储数据的容器,具有自动调整大小的功能。C++ 中的多维向量
在 C++ 中释放 std::vector 对象
发布时间:2023/08/28 浏览次数:52 分类:C++
-
本文将解释如何在 C++/C 中释放 std::vector 对象。 首先,我们将了解释放的自编码方式,然后,我们将研究如何在 C++ 中动态释放 std::vector 对象。在 C++ 中释放对象
在 C++ 中计算两个向量之间的角度
发布时间:2023/08/28 浏览次数:173 分类:C++
-
矢量数学是处理矢量的数学分支,矢量是具有大小和方向的几何对象。 例如,向量尾部形成的角度等于两个向量形成的角度
调整 2D 矢量大小 C++
发布时间:2023/08/28 浏览次数:138 分类:C++
-
在这篇短文中,我们将重点讨论如何在 C++ 中调整 2d 向量的大小。在 C++ 中调整 2D 矢量大小 要在 C++ 中调整二维向量的大小,我们需要使用名为 resize() 的函数
C++ 中的向量迭代器
发布时间:2023/08/28 浏览次数:163 分类:C++
-
本文介绍如何在 C++ 中迭代向量。C++ 提供了许多迭代向量的方法。 这些方法称为迭代器,它指向STL容器的内存地址;
使用 C++ 将文件读入二叉搜索树
发布时间:2023/08/27 浏览次数:52 分类:C++
-
本文将讨论将文件读入 C++ 中的二叉搜索树。 首先,我们将快速讨论二叉搜索树及其操作。稍后我们将看到如何将文件读入二叉搜索树。C++ 中的二叉搜索树