迭代器如何在C ++中内部工作?

问题描述 投票:1回答:1

我无法理解迭代器在C ++中的工作原理。正如我在某些博客中读到的那样,迭代器不包含地址。如果它不包含地址,那么我们将如何精确地递增它,例如it++++it

让我们以向量迭代器为例。

vector<int> ::iterator it;
for(it=vec.begin(); it!=vec.end(); it++)
{
    // do something
}

如果迭代器不是包含地址的指针,那么它到底在做什么++。它存储什么。它在内部如何运作。迭代器如何精确指向向量的元素?

c++ c++11 vector stl iterator
1个回答
1
投票

如果我们不能假定迭代器是指针,则并不意味着迭代器不能在内部依赖指针。可以将迭代器视为指针的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; }

© www.soinside.com 2019 - 2024. All rights reserved.