您的位置:首页 > 其它

STL中vector和array的比较

2017-12-09 20:41 218 查看
 


C++中数组与STL中vector和array的比较

标签: C++STL
2017-03-29 18:43 1841人阅读 评论(0) 收藏 举报


 分类:

【C/C++开发】(17) 


版权声明:本博客参考文献来源于互联网,转载请备注原作链接,欢迎知识共享。

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解放出来。

[cpp] view
plain copy

 print?

//比较数组、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;  

}  

输出结果:



STL:array/vector/list比较

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
 

ref:http://m.blog.csdn.net/article/details?id=49848169
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: