迭代器在C++;? 我无法理解迭代器如何在C++中精确工作。正如我在一些博客中读到的,迭代器不包含地址。如果它不包含地址,那么我们如何精确地增加它,比如it++或+++it

迭代器在C++;? 我无法理解迭代器如何在C++中精确工作。正如我在一些博客中读到的,迭代器不包含地址。如果它不包含地址,那么我们如何精确地增加它,比如it++或+++it,c++,c++11,vector,stl,iterator,C++,C++11,Vector,Stl,Iterator,让我们以向量迭代器为例 vector<int> ::iterator it; for(it=vec.begin(); it!=vec.end(); it++) { // do something } vector::迭代器; for(it=vec.begin();it!=vec.end();it++) { //做点什么 } 如果迭代器不是包含地址的指针,那么它到底在做什么。它在储存什么。它是如何在内部工作的。迭代器是如何精确地指向向量的元素的?如果我们不能假设迭代器是指针

让我们以向量迭代器为例

vector<int> ::iterator it;
for(it=vec.begin(); it!=vec.end(); it++)
{
    // do something
}
vector::迭代器;
for(it=vec.begin();it!=vec.end();it++)
{
//做点什么
}

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

如果我们不能假设迭代器是指针,这并不意味着 迭代器不能在内部依赖指针。
迭代器可以看作是指针的隐喻(我们可以 增量、解引用…),然后在某些情况下(数组、向量)使用此迭代器 可以简单地由指向元素的指针构成(不一定是 这是一个指针,但它是一个指针作为数据成员的结构)

主要的优点是所有的细节都隐藏在这个隐喻中 在普通情况下(如下面示例中的向量),它的行为 就像我们实际使用了指针一样,但在其他情况下(如列表 在下面的示例中)它可能会做一些非常不同的事情。
我们不必为此费心,我们只是用同样的方式编写代码, 我们甚至可以编写相应的通用代码

请注意,以下示例中迭代器的显式用法如下 让我们在这里匹配您的初始问题;最好依靠 实数代码中循环的范围

/**
  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;
}
/**
g++-std=c++17-o prog_cpp prog_cpp.cpp\
-pedantic-Wall-Wextra-Wconversion-Wno符号转换\
-g-O0-UNDEBUG-fsanizize=地址,未定义
**/
#包括
#包括
#包括
模板
无效的
显示(常量字符*标题,
承包商(集装箱和集装箱)
{
使用std::cbegin;
使用std::cend;

STD::您似乎没有代码问题,而是一些C++的一般性问题。您知道操作符重载是什么吗?“如果迭代器不是包含地址的指针”,从技术上讲,指针对于 STD::vector < /C> >(对于大多数C++标准库实现可能使用)是非常有效的迭代器。,但它也可能是为此而设计的类。@Yksisarvinen我不认为任何主要的标准库实现都使用
std::vector
迭代器()@pujadeo如上所述,一个简单的指针对于
std::vector
迭代器也是有效的,但我假设大多数实现都会向迭代器类添加可选的越界检查等。对于其他容器,如
std::list
,指针是不够的,因为元素不是连续存储的因此,必须使用重载运算符的类,例如查找正确的下一个元素。迭代器概念是指针概念的推广。