c++ iterator 是啥意思

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ iterator 是啥意思相关的知识,希望对你有一定的参考价值。

iterator是一种抽象,用来封装对数据结构的遍历操作。比如你可以在不用知道数据结构实现的情况下,调用iterator来遍历。这样,我们可以用同一函数来对不同的数据结构进行遍历,因为函数只操作迭代器,不与具体的数据结构直接耦合。

比如STL中find算法,可以用于任何支持输入迭代器(Input iterator category)的数据结构,我们可以将vector::iterator,list::iterator,map::iterator等传递给find,而这些iterator的实现显然依赖于具体的数据结构,并且有很大差异。

当然其他语言中也有iterator的概念,比如java,C#,python。
参考技术A iterator是C++标准库(STL)中的迭代器
用来进行链表的遍历
参考技术B 迭代器
list<int> lst;
for(list<int>::iterator i = lst.begin(); i != lst.end(); i++)
printf("%d", *i);
iterator本质就是一个指针,和下面类似
char s[] = "hello";
for(char* p = s; *p != '\0'; p++) printf("%c", *p);

C++ 中的 :: 是啥意思? [复制]

【中文标题】C++ 中的 :: 是啥意思? [复制]【英文标题】:What does the :: mean in C++? [duplicate]C++ 中的 :: 是什么意思? [复制] 【发布时间】:2011-03-29 15:54:00 【问题描述】:
void weight_data::rev_seq(string &seq) 
//TODO
std::reverse(seq.begin(), seq.end());

在这个C++方法中,我觉得这个方法没有返回任何东西,所以前缀是void::告诉weight_datarev_seq(string &amp;seq)之间的关系是什么?谢谢!

【问题讨论】:

:: 在 PHP 中被称为 Paamayim Nekudotayim。 【参考方案1】:

weight_data 是 namespace 或类名。

【讨论】:

【参考方案2】:

void 是返回类型。 :: 是作用域解析运算符,所以这意味着rev_seqweight_data 的作用域内。 weight_data 可以是命名空间或类(根据您提供的内容,无法确定是哪个)。

【讨论】:

"weight_data" 被定义为 a.hpp 文件中的一个结构,其中一个名为 "rev_seq" 的方法(未实现),然后在 a.cpp 文件中,这个方法被称为我在问题部分 @ladyfafa: void weight_data::rev_seq(string &amp;seq) ... 那个成员函数的实现。 @sbi:好的,我明白了;可以多次实施吗?即在不同的 cpp 文件中,对来自结构“weight_data”的同一函数“rev_seq”进行不同的实现 @ladyfafa: 否——C++ 有一个“单一定义规则”(ODR),即任何一个函数只能实现(定义)一次。有几种例外情况(例如,对于内联函数),但它们只是一些例外情况,无论如何这都不适合其中任何一种。 @ladyfafa:通常,定义只能出现一次。 (参见What is the difference between a definition and a declaration?)但是,不同的成员函数可以在不同的实现文件中实现。此外,根据某些先决条件(例如,编译程序的平台),条件编译可用于包含同一实体的多个定义之一。【参考方案3】:

在 C++ 中,

A::B 表示Bnamespaceclass 类型A 中的标识符, A.B 表示Bstructclassunion 类型的成员,其实例由对象或引用A 引用,并且 A-&gt;B 表示Bstructclassunion 类型的成员,其实例由指针A 引用。 (相当于(*A).B。)

在其他一些语言中,所有这三种情况都只包含在 . 中。

请注意,在 C++ 中,成员函数不必在其类的定义中实现(定义)。 (如果是,则它们隐含为inline。)它们可以并且经常在单独的实现(.cpp)文件中实现。这样做的好处是,当您更改类的成员函数之一的实现时,并非类的所有用户都需要重新编译。因此,除非weight_datanamespace 名称,否则void weight_data::rev_seq(string &amp;seq) ... 是其类之外的类成员的此类定义。

【讨论】:

非常全面,非常感谢! 注意:*-&gt; 运算符可以重载。通常,它们仅对迭代器和智能指针之类的东西进行重载。设计不佳的代码可能会使这些运算符过载。 @Brian:这是一个非常好的观点!【参考方案4】:

void weight_data::rev_seq(string &amp;seq) 行告诉编译器这是来自weight_datarev_seq(string &amp;seq) 成员函数的定义。如果这只是说void rev_seq(string &amp;seq) ... ,编译器会认为正在定义一个非成员函数,而不是weight_data 类的rev_seq(string &amp;seq) 成员函数。

class weight_data

    void rev_str(string &seq);

这也可能意味着rev_str 指的是作为命名空间weight_data 一部分的函数。

namespace weight_data

    void rev_str(string &seq);

【讨论】:

请注意,weight_data 可能是一个命名空间。另外,我认为您的意思是写“如果这只是说void rev_seq(string &amp;seq) ... ...”。 感谢 sbi 让我注意到这一点。【参考方案5】:

刚刚想到添加 2 个关于 ::

的有趣的东西

a) 运算符 :: 既是一元运算符又是二元运算符

struct A
   int m;
;

int x;
int main()
   ::x;                     // Unary
   int (A::*p) = &A::m;     // Binary

b) $10.3/12 - “显式限定范围运算符 (5.1) 抑制了虚拟调用机制。”

struct A
   virtual void f()cout << 1;
;

struct B : A
   void f()cout << 2;
;

int x;
int main()
   B b;
   A &ra = b;
   ra.f();     // dynamic binding, prints 2
   ra.A::f();  // suppress VF mechanism, prints 1.

【讨论】:

以上是关于c++ iterator 是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

python中的iterable是啥意思

在 C++ 中使用 regex_iterator 的确切方法是啥?

python迭代器是啥意思

iterator_trait 的典型用例是啥

Java中ArrayList的遍历方式是啥意思?

实现 operator[] / iterator 来处理性能问题的方法是啥?