ref:http://m.blog.csdn.net/article/details?id=49848169
在c++11中,STL中提拱了一个新的容器std::array,该容器在某些程度上替代了之前版本的std::vector的使用,更可以替代之前的自建数组的使用。那针对这三种不同的使用方式,先简单的做个比较:
相同点:
1. 三者均可以使用下表运算符对元素进行操作,即vector和array都针对下标运算符[]进行了重载
2. 三者在内存的方面都使用连续内存,即在vector和array的底层存储结构均使用数组
不同点:
1. vector属于变长容器,即可以根据数据的插入删除重新构建容器容量;但array和数组属于定长容量。
2. vector和array提供了更好的数据访问机制,即可以使用front和back以及at访问方式,使得访问更加安全。而数组只能通过下标访问,在程序的设计过程中,更容易引发访问 错误。
3. vector和array提供了更好的遍历机制,即有正向迭代器和反向迭代器两种
4. vector和array提供了size和判空的获取机制,而数组只能通过遍历或者通过额外的变量记录数组的size
5. vector和array提供了两个容器对象的内容交换,即swap的机制,而数组对于交换只能通过遍历的方式,逐个元素交换的方式使用
6. array提供了初始化所有成员的方法fill
7. vector提供了可以动态插入和删除元素的机制,而array和数组则无法做到,或者说array和数组需要完成该功能则需要自己实现完成
8. 由于vector的动态内存变化的机制,在插入和删除时,需要考虑迭代的是否失效的问题。
基于上面的比较,在使用的过程中,可以将那些vector或者map当成数组使用的方式解放出来,可以直接使用array;也可以将普通使用数组但对自己使用的过程中的安全存在质疑的代码用array解放出来。
//比较数组、vector、array输出结果:
#include <iostream>
#include <vector>
#include <array>
#include <iomanip>
using namespace std;
int main(void)
{
/*1.构造方式
* vector:有多种构造方式,不需要定义元素个数;除常见的初始化方式外,还可以
* 通过vector和数组构造新的vector
* array:定义时必须指定array的大小,可通过array构造新的array,不可使用数组构造
* 数组:定义时必须指定array的大小,使用{}初始化
*/
vector<int> myvector = {1,2,3,4,5};
array<int, 5> myarray = {1,2,3,4,5};
int myint[5] = { 1, 2, 3, 4, 5 };
/*2.访问方式
* 三者均可通过下标运算符[]对元素进行操作,vector和array还可以通过at/front/back进行操作
*/
cout << setw(10) << "vector" << setw(10) << "array" << setw(10) << "数组" << endl;
for (int i = 0; i < 5; i++)
{
cout << setw(10) << myvector.at(i) << setw(10) << myarray.at(i) << setw(10) << myint[i] << endl;
}
/*3.遍历方式
* vector和array还可以通过正向和反向迭代器对元素进行遍历
*/
cout << "=============正向迭代器遍历=========="<< endl;
for (vector<int>::iterator it = myvector.begin(); it != myvector.end();++it)
{
cout << *it << endl;
}
cout << "=============反向迭代器遍历==========" << endl;
for (vector<int>::reverse_iterator it = myvector.rbegin(); it != myvector.rend(); ++it)
{
cout << *it << endl;
}
/*4.增删元素
* vector可以通过push_back/pop_back/emplace/emplace_back/insert动态增删元素
* array和数组无法实现动态增删元素
*/
myvector.push_back(6);
myvector.emplace_back(7);
vector<int>::iterator it = myvector.end();
myvector.insert(it, { 8, 9 });//在尾部插入元素,可通过it改变插入位置,也可以插入多个元素
myvector.pop_back();
cout << "=============动态增删元素==========" << endl;
for (vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)
{
cout << *it << endl;
}
return 0;
}
Function |
array |
vector |
list |
constructor |
no |
yes |
yes |
destructor |
no |
yes |
yes |
empty() |
yes |
yes |
yes |
size() |
yes |
yes |
yes |
resize() |
no |
yes |
yes |
capacity() |
no |
yes |
no |
reserve() |
no |
yes |
no |
max_size() |
yes |
yes |
yes |
erase() |
no |
yes |
yes |
clear() |
no |
yes |
yes |
operator= |
yes |
yes |
yes |
operator< |
yes |
yes |
yes |
operator== |
yes |
yes |
yes |
operator[] |
yes |
yes |
no |
at() |
yes |
yes |
no |
front() |
yes |
yes |
yes |
back() |
yes |
yes |
yes |
push_back() |
no |
yes |
yes |
pop_back() |
no |
yes |
yes |
assign() |
yes |
yes |
yes |
insert() |
no |
yes |
yes |
swap() |
yes |
yes |
yes |
push_front() |
no |
no |
yes |
pop_front() |
no |
no |
yes |
merge() |
no |
no |
yes |
remove() |
no |
no |
yes |
remove_if() |
no |
no |
yes |
reverse() |
no |
no |
yes |
sort() |
no |
no |
yes |
splice() |
no |
no |
yes |
unique() |
no |
no |
yes |