我无法理解迭代器在C ++中的工作原理。正如我在某些博客中读到的那样,迭代器不包含地址。如果它不包含地址,那么我们将如何精确地递增它,例如it++
或++it
。
让我们以向量迭代器为例。
vector<int> ::iterator it;
for(it=vec.begin(); it!=vec.end(); it++)
{
// do something
}
如果迭代器不是包含地址的指针,那么它到底在做什么++。它存储什么。它在内部如何运作。迭代器如何精确指向向量的元素?
如果我们不能假定迭代器是指针,则并不意味着迭代器不能在内部依赖指针。可以将迭代器视为指针的metaphor(我们可以增量,取消引用...),然后在某些情况下(数组,向量)使用此迭代器可以简单地由指向元素的指针组成(不一定完全是这个指针,而是一个以指针作为数据成员的结构)。
主要优点是所有细节都隐藏在此[[隐喻在平凡的情况下(例如以下示例中的向量)就像我们实际使用过指针一样,但是在其他情况下(例如列表)在下面的示例中)它所做的事情可能非常不同。我们不必为此担心,我们只需以相同的方式编写代码,而且我们甚至可以编写行为相应的通用代码。
请注意,在以下示例中,迭代器的显式用法是让这里匹配您的最初问题;最好依靠真实代码中的范围循环。/**
g++ -std=c++17 -o prog_cpp prog_cpp.cpp \
-pedantic -Wall -Wextra -Wconversion -Wno-sign-conversion \
-g -O0 -UNDEBUG -fsanitize=address,undefined
**/
#include <iostream>
#include <vector>
#include <list>
template<typename T>
void
display(const char *title,
const T &container)
{
using std::cbegin;
using std::cend;
std::cout << title;
for(auto it=cbegin(container); it!=cend(container); ++it) // range-for would be better
{
std::cout << ' ' << *it;
}
std::cout << '\n';
}
int
main()
{
const auto v=std::vector<int>{10, 20, 30, 40, 50};
const auto l=std::list<int>{10, 20, 30, 40, 50};
//
std::cout << "specific v:";
for(auto it=cbegin(v); it!=cend(v); ++it) // range-for would be better
{
std::cout << ' ' << *it;
}
std::cout << '\n';
//
std::cout << "specific l:";
for(auto it=cbegin(l); it!=cend(l); ++it) // range-for would be better
{
std::cout << ' ' << *it;
}
std::cout << '\n';
//
display("generic v:", v);
display("generic l:", l);
return 0;
}