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

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

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

时间: 2024-08-02 02:46:03

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

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

C++ Primer(第五版)学习笔记_3_标准模板库vector(2) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 6.元素的插入 insert()方法可以在vector对象的任意位置前插入一个新的元素,同时,vector自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置. 要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标. #include <iostream> #include <vector> using namespa

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器 多重映照容器multimap与map结构基本相同,但由于重复键值存在,所以multimap的元素插入.删除.查找都与map的方法不相同. 1.multimap对象创建.元素插入 插入元素时,需要使用insert()方法和类似pair<string,double>("Jack", 300.5)的元素结构.可以看到,重复的元素是按照插入的先后顺序排序的. #include <iostre

C++ Primer(第五版)学习笔记_5_标准模板库string(2)

C++ Primer(第五版)学习笔记_5_标准模板库string(2) 10.搜索string对象的元素或子串 采用find()方法可查找字符串中的第一个字符元素(char, 用单引号界定)或者子串(用双引号界定):如果查到,则返回下标值(从0开始计数),如果查不到,则返回一个很大的数string:npos(即:4294967295). #include <iostream> #include <stdio.h> #include <string> using nam

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 标准模板库(STL)提供三种类型的组件:容器.迭代器和算法,他们都支持泛型程序设计标准. 容器主要有两类:顺序容器和关联容器.顺序容器(vector.list.deque和string等)是一系列元素的有序集合.关联容器(set.multiset.map和multimap)包含查找元素的键值. 迭代器的作用是遍历容器. STL算法库包含四类算法:排序算法.不可变序算法.变序性算法

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

C++ Primer(第五版)学习笔记_4_标准模板库string(1) 1.创建string对象 创建一个空字符串,其长度为0 #include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { string s; cout << s.length() << endl; return 0; } 运行结果: 0 2.给string对象赋值

C++ Primer(第五版)学习笔记_6_标准模板库_set集合容器

C++ Primer(第五版)学习笔记_6_标准模板库_set集合容器 Set集合容器实现了红黑树(Red-BlackTree)的平衡二叉检索树的数据结构,在插入元素时,它会自动调整二叉树的排序,把该元素放到适当的位置. (1)确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值: (2)另外,还得确保根节点左子树的高度与右子树的高度相等.这样,二叉树的高度最小,从而检索速度最快. 平衡二叉检索树的检索使用中序遍历算法,检索效率高.默认情况下,将键值由小到大遍历. 对于s

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器 map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系. map映照容器的数据结构也是采用红黑树来实现的. 1.map创建.元素插入和遍历访问 #include <iostream> #include <stdio.h> #include <vector> #include <map> #include <string> using n

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器 多重集合容器multiset与set一样,也是使用红黑树来组织元素数据的,唯一不用的是,multiset允许重复的元素键值插入.其结构示意图如下: 1.multiset元素插入 #include <iostream> #include <stdio.h> #include <vector> #include <set> #include <string> usi

C++ Primer 第五版学习笔记

<C++ Primer>第五版中文版学习笔记 ? C++ Primer 第五版学习笔记