实战c++中的string系列--string的遍历(使用下标还是iterator)

迭代器提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象.

我们都知道可以用下标运算来访问string对象和vector对象。而另外还有一种更通用的方法也可以实现这样的方法。名曰:迭代器(iterator)。

类似于指针,迭代器也提供了对对象的间接访问。就迭代器而言,其对象是容器中的元素或者string中的字符。使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素。迭代器有有效和无效之分,有效的迭代器指向某个元素或者容器中尾元素的下一个位置。其他情况均为无效。

和指针不一样的是,迭代器不是使用取址符,而是使用begin和end成员。

结合解引用和成员访问操作

解引用迭代器可以获得迭代器所指的对象,如果该对象的类型恰好是类,那么就可以访问这个类的成员。例如:

(*it).empty();

这里要注意*it一定要加圆括号,否则会出错。如果不加,那么这句话的意思就变成了访问it的empty成员,但是it是个迭代器,没有empty成员。C++11中提供了箭头运算符->,箭头运算符把解引用和成员访问两个操作结合在了一起。故iter->mem 等价于(*iter).mem。

强烈注意:一旦使用了迭代器的循环体,那就不要向迭代器所属的容器添加元素。

迭代器的算术运算:

iter + n 迭代器加上一个整数后仍是一个迭代器,在这里迭代器和指针很像,可以理解成地址上的加减。

iter1 - iter2 两个迭代器相减的结果是它们之间的距离。即所指向位置的距离。

<,<=,>,>= 迭代器关系运算符,如果某迭代器指向的容器位置在另一个迭代器所指位置之前,则说前者小于后者。

==============================================================

为何string vector可以使用下标访问,还设计了迭代器模式呢?

个人觉得:

1、STL设置的初衷是,算法 容器分离

2、迭代器更通用些,有的容器对象不支持下标

3、一些方法,比如erase只能传递iterator

就vector来说差别不大,迭代器其实就是原生指针,但是就C++整体容器来说还是迭代器好,像list这些容器等等,迭代器给你提供一个中间层,抽象掉各容器间的差异,让你能以相同的方式访问容器

时间: 2024-10-23 12:20:33

实战c++中的string系列--string的遍历(使用下标还是iterator)的相关文章

实战c++中的vector系列--vector的遍历(stl算法、vector迭代器(不要在循环中判断不等于end())、operator[])

遍历一个vector容器有很多种方法,使用起来也是仁者见仁. 通过索引遍历: for (i = 0; i<v.size(); i++) { cout << v[i] << " "; } 迭代器遍历: for (vInt::const_iterator iter = v.begin(); iter != v.end();iter++) { cout << *iter << " "; } 算法遍历: copy(v.b

实战c++中的string系列--string的分割、替换(类似string.split或是explode())

对一个字符串根据某个字符进行分割也是在实战中经常遇到的问题,也是面试中经常会被人提及的. 如果你是个C Sharp程序员,你会知晓string.split函数,有下面这些重载: 1) public string[] Split(params char[] separator) 2) public string[] Split(char[] separator, int count) 3) public string[] Split(char[] separator, StringSplitOpt

实战c++中的string系列--string的替换、查找(一些与路径相关的操作)

今天继续写一些string操作. string给我们提供了很多的方法,但是每在使用的时候,就要费些周折. 场景1: 得到一个std::string full_path = "D:\program files\csdn",但是我想得到"D:\program files\vagaa"这个路径. 这就需要字符串的替换 std::string full_path = "D:\\program files\\csdn" const size_t last_

实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)

之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中,vector A中的结果我们可想而知,但是vector B中的元素还会如何? 看看之前写过的程序: #include <iostream> #include <vector> int main () { std::vector<int> myvector (3,100); std::vector<int>::iterator it; it = myvector

实战c++中的vector系列--vector&lt;unique_ptr&lt;&gt;&gt;赋值给vector&lt;unique_ptr&lt;&gt;&gt;

之前博客讲到 vector可以使用insert方法,将一个vector copy到另一个vector的后面. 之前的博客也讲到过,如果vector容器内部放的是unique_ptr是需要进行所有权转移的. 现在就来八一八如何vector<unique_ptr<>> insert to vector<unique_ptr<>> 如果常规的vector,我们就可以这么使用insert: // inserting into a vector #include &l

实战c++中的vector系列--使用sort算法对vector&lt;unique_ptr&lt;string&gt;&gt;进行排序(sort函数出错“应输入 2 个参数,却提供了 3 个)

之前博客写了对vector使用sort算法进行的排序,之前也写到过vector<unique_ptr<string>>的一些处理方法. 今天就写一下对vector<unique_ptr<string>>使用sort算法进行排序. #include<iostream> #include<string> #include<vector> #include<algorithm> #include<memory&

实战c++中的string系列--string与char*、const char *的转换(data() or c_str())

在project中,我们也有非常多时候用到string与char*之间的转换,这里有个一我们之前提到的函数 c_str(),看看这个原型: const char *c_str(); c_str()函数返回一个指向正规C字符串的指针, 内容与本string串同样. 这就看到了吧,返回值是const char*,这里须要注意一下. 1 string转const char* 当然是用到上面所述的方法c_str(): string s1 = "abcdeg"; const char *k =

实战c++中的string系列--string的连接(+= or append or push_back)

string的连接也是经常用到的,string重载了一些运算符: 首先看一看重载+运算符,用于串联两个字符串对象: 源码: template<class CharType, class Traits, class Allocator> basic_string<CharType, Traits, Allocator> operator+( const basic_string<CharType, Traits, Allocator>& _Left, const

实战c++中的string系列--string到LPCWSTR的转换

今天再来介绍一下如何从string到LPCWSTR的转换. LPCWSTR是什么类型呢? 看看如何定义的: typedef const wchar_t* LPCWSTR; 顾名思义就是: LPCWSTR是一个指向unicode编码字符串的32位指针,所指向字符串是wchar型,而不是char型. 比如说MessageBoxW的第二.第三个参数就是LPCWSTR类型. `MessageBoxW(__in_opt HWND hWnd, __in_opt LPCWSTR lpText, __in_op