您的位置:首页 > 编程语言 > C语言/C++

C++数组、指针与vector、iterator

2016-07-04 19:32 288 查看
今天有点闲,于是打开电子版的<<C++ PRIMER 4TH>>来看。其中9.2节有一个表9.4,它指出了vector 和 deque类型迭代器支持的操作。这本来是很平常的,但是表中的iter1+iter2引起了我极大的兴趣。于是写了下面一段代码来验证是否真的能支持这运算
#include <iostream>

#include <vector>

using namespace std;

int main(){

vector<int> vec(10);

vector<int>::iterator iter1=vec.begin();

vector<int>::iterator iter2=vec.end();

iter1+=iter2;

return 0;

}


使用MINGW和g++进行编译,结果报错,错误信息如下:
candidates are: __gnu_cxx::__normal_iterator<_Iterator, _Container>& __gnu_cxx::__normal_iterator<_Iterator, _Container>::operator+=(const typename std::iterator_traits<_Iterator>::difference_type&) [with _Iterator = int*, _Container
= std::vector<int, std::allocator<int> >]
       这也就是说在头文件中根本就没有为iterator进行+= iter,iter1+iter2运算符的重载。进过测试之后发现-=符号也报同样的错。至于iter + n ,iter – n,iter1 - iter2,这三种运算是没有任何编译问题的。也许是因为编译器的问题吧,但是实验到了这里,我不由得开始思考到底iterator和指针到底有怎么样的联系和区别,
       经过思考,我得出了下面几个相同的地方:
1.       指针和iterator都支持与整数进行+,-运算,而且其含义都是从当前位置向前或者向后移动n个位置
2.       指针和iterator都支持减法运算,指针-指针得到的是两个指针之间的距离,迭代器-迭代器得到的是两个迭代器之间的距离
3.       通过指针或者iterator都能够修改其指向的元素
通过上面这几点看,两者真的很像,但是两者也有着下面的几个不同地方
1.       cout操作符可以直接输出指针的值,但是对迭代器进行在操作的时候会报错。通过看报错信息和头文件知道,迭代器返回的是对象引用而不是对象的值,所以cout只能输出迭代器使用*取值后的值而不能直接输出其自身。
2.       指针能指向函数而迭代器不行,迭代器只能指向容器
这就说明了迭代器和指针其实是完全不一样的概念来的。指针是一种特殊的变量,它专门用来存放另一变量的地址,而迭代器只是参考了指针的特性进行设计的一种STL接口。
笔者曾在网上看到这样一种说法:迭代器是广义指针,而指针满足所有迭代器要求。迭代器是STL算法的接口,而指针是迭代器,因此STL算法可以使用指针来对基于指针的非STL容器进行操作。
笔者觉得上面说法也有几分道理,但是到底正不正确就留给看官自己判断了。但是有一点希望大家注意的是:千万不要把指针和迭代器搞混了。也许某些编译器使用指针来实现迭代器以至于有些人会误以为指针和迭代器是一个概念来的。
PS:《C++ PRIMER 4TH》表9.4有误,希望各位看官在看那本书的时候注意一下。
原文地址:http://blog.csdn.net/justin12zhu/article/details/4573876

C++定义了内容丰富的抽象数据类型标准库。其中最重要的之一就是vector。它定义了长度可变的同类型对象的集合。它往往将迭代器用作配套类型,用于访问其中的元素。迭代器是一种检查容器内元素并遍历元素的数据类型。这二者是语言组成部分中更基本的数据类型数组和指针的抽象。

现将两对的主要区别简要陈述:

一、数组与vector:

1、vector是数组的抽象,首先,用户程序使用vector之前,必须包含相关头文件,最好还应提供合适的using声明:

#include <vector>
using std::vector;

而数组类型则不用;

2、vector不是一种数据类型,而是一个类模板,它可以用来定义任意多种数据类型。vector标准库类型提供了vector操作,可以直接调用用来检验象对是否为空串、元素的个数、vector对象的复制、动态增加元素、比较等操作,而数组则没有直接提供这些操作的函数可调用,尤其是要实现数组的复制及求长度的操作相对很不方便;

3、vector是长度可变的,而数组一旦定义长度就不再改变;

4、vector的索引类型为vector::size_type,数组下标类型为size_t。

二、指针与iterator

1、迭代器是指针的抽象,标准库为每一种标准容器(包括vector)定义了一种迭代器,如:

vector<int>::iterator iter;

这条语句定义了一个名为iter的变量,它的数据是由vector<int>定义的iteretor类型,而指针则是直接初始化为指向某一数组或单个对象的指针,还可以指向函数,而迭代器不行;

2、每种容器都定义了一对命名为begin和end的函数,用于返回迭代器,其中end操作返回的是迭代器指向vector的"末端元素的下一个",它起到的只是个哨兵的作用,表示我们已经处理完vector中的所有元素,而指针则没有;

3、任何改变vector长度的操作都会使已存在的迭代器失效,即释放已有内存,重新申请内存;

4、cout操作符可以直接输出指针的值,但迭代器进行此操作的时候会报错,因为迭代器返回的是对象引用而不是对象的值,因此只能输出迭代器使用"*"取值后的值而不能直接输出其自身;

5、因此看来,指针是一种特殊的变量,专门用来存放另一变量的地址,而迭代器是参考了指针的特性而抽象出的STL接口。

相同:

1、迭代器可以做两个迭代器的相减,前提是二者指向同一vector中的元素,或指向vector末端之后的下一个元素,指针也可以,前提是指向同一数组,得到的都是二者之间的距离;同样都不能实现相加操作;

2、都是用"*"操作符来实现解引用;

3、二者都支持与整数进行加减操作,其含义都是个自当前位置向前或向后移动相应的位置;

4、二者都能修改其指向的元素。

二者在const修饰下的不同,在const的应用中在论述。

请各位读者指正赐教.....

原文地址:http://freemao.blog.51cto.com/2608326/1181240
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: