码迷,mamicode.com
首页 > 编程语言 > 详细

C++ Primer(第五版)学习笔记_2_标准模板库vector(1)

时间:2015-07-07 16:55:59      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:c++   stl   

C++ Primer(第五版)学习笔记_2_标准模板库vector(1)

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢技术分享


    向量容器vector不但能像数组一样进行随机访问,还能在尾部插入元素,完全可以替代数组。

    值得注意的是,vector具有内存自动管理的功能,对于元素的插入和删除,可以动态调整所占的内存空间。

    容器vector的下标是从0开始的,如果vector容器的大小是n,则元素下标为0~n-1,这和数组的一样的。不一样的是,vector可以随时调整其大小。

    vector重要的方法有三个:使用push_back()方法从尾部扩张元素;使用insert()方法在某个元素位置前插入新元素;使用size()方法返回容器的大小;使用begin()返回首元素位置的迭代器;使用end()返回最后一个元素的下一个元素位置的迭代器。需要注意的是,在STL中应该善用迭代器iterator,不能受数组下标思想的限制。

    向量的元素类型可以是int,double,char等简单类型;也可以是结构体或string基本字符序列容器等。

 

1、创建vector对象

创建vector对象常用的有三种形式:

(1)不指定容器的元素个数:

vector<int>v;

(2)创建时,指定容器的大小,如定义存储10个double元素的向量容器。

vector<double>v(10);  //每个元素都被初始化为0.0

(3)创建一个具有10个元素的向量容器,每个元素都有指定的初始值8.6。

vector<double>v(10, 8.6);

vector<int>v({1, 2});  //创建一个包含1,2的向量

vector<int>v(v1.begin(), v1.end());  //将v1复制到向量v中

(4)v.reserve(k)表示容器预留k个空间容量即capacity(指容器在分配新的存储空间之前能存储的元素总数),但并不是真正的创建对象,需要通过insert()或push_back()等创建对象。

(5)v.resize(k)既分配了空间,也创建了对象。用法类似于(2),v.resize(10),每个元素都被初始化为0.0,对v重新分配空间。

结论:reserve只修改capacity大小,不修改size大小,resize既修改capacity大小,也修改size大小。


#include<iostream>
#include<vector>
 
usingnamespace std;
 
int main(intargc, char* argv[])
{
    vector<int> num;
    cout << "初始的capacity:" << num.capacity() <<endl;
    cout << "初始的size:" << num.size() << endl;
 
    num.reserve(10);
    cout << "num的capacity:" << num.capacity() <<endl;
    cout << "num的size:" << num.size() << endl;
 
    num.resize(20);
    cout << "num的capacity:" << num.capacity() <<endl;
    cout << "num的size:" << num.size() << endl;
    return 0;
}

运行结果:

初始的capacity:0

初始的size:0

num的capacity:10

num的size:0

num的capacity:20

num的size:20

 

(6)通过assign()方法,可以重新赋值新元素到vector向量容器中,并且会清除旧的vector容器中的内容。用法类似于(3)。

v.assign(10,8.6);

v.assign({1,2});  //创建一个包含1,2的向量

v.assign(v1.begin(),v1.end());  //将v1复制到向量v中

 

 

2、尾部元素扩张

    通常使用push_back()对vector容器在尾部追加新元素。vector容器会自动分配新内存空间。既可以对空的vector对象扩张,也可以对已有元素的vector对象扩张。

下面代码将2,7,9三个元素从尾部添加到num容器中,这样num容器中就有三个元素,其值依次是2,7,9。

#include <iostream>
#include <vector>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    vector<int> num;
    num.push_back(2);
    num.push_back(7);
    num.push_back(9);
 
    return 0;
}

3、下标方式访问vector元素

    访问或遍历vector对象是常要做的事情。对于vector对象,可以采用下标方式随意访问某个元素,也可以采用下标方式对某个元素重新赋值,这点类似于数组的访问方式。

#include <iostream>
#include <vector>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    vector<int> num;
    num.push_back(2);
    num.push_back(7);
    num.push_back(9);
 
    for(int i = 0; i < num.size(); i++)
        cout << num[i] <<" ";
    cout << endl;
    return 0;
}

运行结果:

2  7  9

 

4、用下标方式赋值,当已经超过vector容器的大小时,就不能用下标容器赋值了。但此时,还可以用push_back()方法赋值。

#include <iostream>
#include <vector>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    vector<int> num(3);
   
    num[0] = 2;
    num[1] = 7;
    num[2] = 9;
   
    num.push_back(11);
 
    for(int i = 0; i < num.size(); i++)
        cout << num[i] <<" ";
    cout << endl;
    return 0;
}

运行结果

2  7 9  11

 

5、使用迭代器访问vector元素

    使用迭代器iterator对vector对象进行遍历访问,迭代器类型一定要与它所遍历的vector对象的元素类型一致。

#include <iostream>
#include <vector>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    vector<int> num;
    num.push_back(2);
    num.push_back(7);
    num.push_back(9);
 
    for(vector<int>::iterator iter = num.begin(); iter !=num.end(); iter++)
        cout << *iter << " " ;
    cout << endl;
    return 0;
}

运行结果:

2  7  9


版权声明:本文为博主原创文章,未经博主允许不得转载。

C++ Primer(第五版)学习笔记_2_标准模板库vector(1)

标签:c++   stl   

原文地址:http://blog.csdn.net/keyyuanxin/article/details/46790339

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!