C++ 笔记(23)— STL vector 类(实例化 vector、末尾插入、指定位置插入、数组方式访问元素、指针方式访问元素、删除元素、大小与容量区别)_std::vector 插入std::vector-程序员宅基地

技术标签: C++  vector  

1. vector 特点

vector 是一个模板类,提供了动态数组的通用功能,具有如下特点:

  • 在数组末尾添加元素所需的时间是固定的,即在末尾插入元素的所需时间不随数组大小而异,在末尾删除元素也如此;
  • 在数组中间添加或删除元素所需的时间与该元素后面的元素个数成正比;
  • 存储的元素数是动态的,而 vector 类负责管理内存;

要使用 std::vector 类,需要包含下面的头文件:

#include <vector>

2. 实例化 vector

要实例化 vector ,需要指定要在该动态数组中存储的对象类型:

std::vector<int> i;
std::vector<float> f;

要声明指向 list 中元素的迭代器,可以这样做:

std::vector<int>::const_iterator elementInVec;

如果需要可用于修改值或调用非 const 函数的迭代器,可使用 iterator 代替 const_iterator

下面代码演示了几种实例化 vector 的方式:

#include <vector>
#include <iostream>

using namespace std;

void print(vector<int> vectorName)
{
    
    for(size_t i=0; i<vectorName.size(); i++)
    {
    
        cout << vectorName[i] << endl;
    }
}

int main ()
{
    
    vector<int> a;  // 1. 默认构造函数实例化
    cout << "a.size() is " << a.size() << endl;

    vector<int> b {
    1,2,3};  // 2. 使用 c++ 11 列表初始化
    cout << "b.size() is " << b.size() << endl;
    print(b);

    vector<int> c (5);  // 3. 初始化 vector 为 5 个元素
    cout << "c.size() is " << c.size() << endl;
    print(c);

    vector<int> d (3, 10);  // 4. 初始化 vector 为 3 个元素,每个元素为 10
    cout << "c.size() is " << c.size() << endl;
    print(d);

    vector<int> e (d);  // 5. 将 vector d 初始化为 e 的值
    cout << "e.size() is " << e.size() << endl;
    print(e);

    // 6. 初始化 f 为 5 个元素,并且是 vector d 的前 5 个元素
    vector<int> f (d.cbegin(), d.cbegin()+5);
    cout << "f.size() is " << f.size() << endl;
    print(f);

    return 0;
}

上述代码演示了如何为整型具体化 vector 类,即实例化一个存储整型数据的 vector 。该 vector 名为 a,它使用了默认构造函数,如第 16 行所示。在不知道容器最小需要多大,即不知道要存储多少个整数时,默认构造函数很有用。

3. 使用 push_back( )在末尾插入元素

vector 中插入元素时,元素将插入到数组末尾,这是使用成员函数 push_back() 完成的:

std::vector <int> a; 	// 声明一个 int 型的 vector
// 插入数据
a.push_back(50);
a.push_back(1);

完整示例:

int main ()
{
    
    std::vector<int> a;  // 声明 vector a
    std::cout << "a.size() is " << a.size() << std::endl; // a.size() is 0

    a.push_back(10);
    a.push_back(5);
    a.push_back(1);
    std::cout << "a.size() is " << a.size() << std::endl; // a.size() is 3

    return 0;
}

4. 列表初始化

C++11 通过 std::initialize_list<> 支持列表初始化,让您能够像处理静态数组那样,在实例化 vector 的同时初始化其元素。与大多数容器一样, std::vector 也支持列表初始化,让您能够在实例化 vector 的同时指定其元素:

std::vector<int> a = {
    50, 1, 987, 1001};
// 或者
std::vector<int> a {
    50, 1, 987, 1001};

5. 使用 insert( )在指定位置插入元素

push_back()vector 末尾插入元素。如果要在中间插入元素,可以使用 insert 。有以下几种插入方式:

  1. 插入指定的位置
vector<int> a;
a.insert(a.begin(), 25);
a.insert(a.begin()+2, 25);
  1. 指定插入位置、要插入的元素数以及这些元素的值(都相同)
a.insert (a.end(), 2, 45);	// 插入两个元素均为 45 的值
  1. 将另一个 vector 的内容插入到指定位置:
vector <int> b (2, 30);
a.insert (a.begin() + 1, b.begin (), b.end ());

虽然函数 vector::insert() 用途广泛,但给 vector 添加元素时,应首选 push_back() 。这是因为将元素插入 vector 时, insert() 可能是效率最低的(插入位置不是末尾时),因为在开头或中间插入元素时,将导致 vector 类将后面的所有元素后移(为要插入的元素腾出空间)。

根据容器中包含的对象类型,这种移动操作可能需要调用复制构造函数或赋值运算符,因此开销可能很大。在上述例子中, vector 包含的是 int 对象,移动开销不是很大。但在其他情况下,情况可能并非如此。

注意:如果需要频繁地在容器中间插入元素,应选择 std::list

6. 使用数组语法访问 vector 中的元素

可使用下列方法访问 vector 的元素:

  • 使用下标运算符 [] 以数组语法方式访问;
std::vector<int> tenElements (10);
// 可使用类似于数组的语法访问并设置各个元素:
tenElements[3] = 2011; 

for (size_t index = 0; index < integers.size(); ++index)
{
    
    cout << "Element[" << index << "] = " ;
    cout << integers[index] << endl;
}
  • 使用成员函数 at()
// 获取索引为 2 的元素
cout << integers.at(2);

cout << integers.at(index);

at() 函数在运行阶段检查容器的大小,如果索引超出边界(无论如何都不能这样做),将引发异常。

  • 使用迭代器;
vector <int>::const_iterator element = integers.cbegin ();

7. 使用指针语法访问 vector 中的元素

vector <int> a (10);
vector <int>::const_iterator element = a.cbegin();
while (element != a.end ())
{
    
    size_t index = distance (a.cbegin(), element);

    cout << "Element at position ";
    cout << index << " is: " << *element << endl;

    // move to the next element
    ++ element;
}

std::distance 来计算元素的偏移量(相对于开头的位置),这是根据 cbegin() 和指向元素的迭代器计算得到的。

8. 删除 vector 中的元素

除支持使用 push_back() 函数在末尾插入元素外, vector 还支持使用 pop_back() 函数将末尾的元素删除。使用 pop_back() 将元素从 vector 中删除所需的时间是固定的,即不随 vector 存储的元素个数而异。

vector <int> a (10);
a.pop_back(); // 删除最后一个元素

9. 大小与容量的区别

vector 的大小指的是实际存储的元素数,而 vector 的容量指的是在重新分配内存以存储更多元素前 vector 能够存储的元素数。因此, vector 的大小小于或等于容量。

  • 要查询 vector 当前存储的元素数,可调用 size()
cout << "Size: " << integers.size ();
  • 要查询 vector 的容量,可调用 capacity()
cout << "Capacity: " << integers.capacity () << endl;

10. 清空 vector 元素

要清空 vectordequeSTL 容器,即删除其包含的所有元素,可使用函数 clear()

integers.clear();

vectordeque 还包含成员函数 empty() ,这个函数在容器为空时返回 true ,而不像 clear() 那样删除既有的元素。

intDeque.clear();
if (intDeque.empty())
{
    
	cout << "The container is now empty" << endl;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wohu1104/article/details/108430961

智能推荐

WINBOND/华邦 W25Q64JVZPIQ 3V 64M-位串行闪存 双通道、四通道 SPI NOR FLASH 存储器_双通道 spi flash-程序员宅基地

文章浏览阅读386次,点赞3次,收藏4次。W25Q64JVZPIQ 3V 64M-位串行闪存 双通道、四通道 SPI NOR FLASH 存储器_双通道 spi flash

表单从gb2312的页面提交到utf-8页面,或者表单从utf-8的页面提交到gb2312页面的解决办法...-程序员宅基地

文章浏览阅读420次。·在不同编码的页面之间提交表单 ,可使用accept-charset属性,此属性FF支持,但是IE不支持--------------------------------------------------------------------1. 表单从gb2312的页面提交到utf-8页面时。即 ·<form method="post" action="2.php" accept-cha..._前端 utf-8 gb2312

nodejs 之 fs模块-程序员宅基地

文章浏览阅读36次。Node.js的文件系统的Api//公共引用var fs = require('fs'),path = require('path');1、读取文件readFile函数//readFile(filename,[options],callback);/** * filename, 必选参数,文件名 * [options],可选参数,可指定flag...

推荐系统中的文本挖掘与情感分析_基于机器学习文本情感分析的商品评价推荐系统-程序员宅基地

文章浏览阅读3.8k次。作者:禅与计算机程序设计艺术 《推荐系统中的文本挖掘与情感分析》引言1.1. 背景介绍随着互联网技术的快速发展,推荐系统作为人工智能领域的一个重要分支,已经深入到我们生活的方方面面。推荐系统通过收集用户的历_基于机器学习文本情感分析的商品评价推荐系统

Android Studio无法自动填充代码的可能原因及解决办法_android studio没有代码补全-程序员宅基地

文章浏览阅读909次。在网上看了有的是setting里面的设置问题,也有的是因为该软件的节能模式模式开了 这俩原因在CSDN上面都能搜到。我发现我的是因为 代码不做<>范围内,试试在需要自动填充的代码前面,先打一个<,应该就可以解决了。_android studio没有代码补全

分享 11 张 Python 自学知识点速查表,拿走不谢!_python学习表-程序员宅基地

文章浏览阅读302次。分享 11 张 Python 自学知识点速查表,拿走不谢!分享 11 张 Python 知识点速查表,文末有领取方式。内容是我刚从国外网站上搬运的,新鲜出炉,全是英文版没有中文翻译。目录如下:这些知识点循序渐进,由浅入深,全部制作成了 pdf,方便阅读。内容丰富,包括了基础知识点,例如关键字、数据结构、复杂数据类型、类、函数、面向对象编程等等,也有面试问题,以及 Numpy 和机器学习的内容。其中部分内容的截图如下:这些速查表制作比较美观,图文配色很养眼,适合基础入门的同学食用。_python学习表

随便推点

qq文件对方接收后一定会有提示吗_QQ接收别人发的文件怎么设置不弹出接收信息...-程序员宅基地

文章浏览阅读6.4k次。QQ接收别人发的文件怎么设置不弹出接收信息以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!QQ接收别人发的文件怎么设置不弹出接收信息系统设置 消息窗口 把允许来消息时弹出窗口前面的勾去掉希望能帮到你qq怎么设置锁屏接收信息如果是安卓系统,打开设置——应用——找到QQ程序——选择显示悬浮窗。超级QQ怎么设置不接收信息现在还..._qq传输完文件后不提醒

PIL保存二维numpy数组(2,2)为灰度图和RGB图_pil只能保存灰度图像吗-程序员宅基地

文章浏览阅读6.6k次,点赞3次,收藏9次。如果使用cv2,直接保存二维数组就可以了,只是只能保存为灰度图(8bit);如果偏要保存为RGB图,则需要使用np.stack进行深度的堆叠(每个深度R/G/B的值是相同的),然后再保存就是RGB图了如果使用的是PIL,则没那么简单了,首先PIL 只接受浮点数,其次,如果要将二维数组保存为RGB图,需要使用convert('RGB')转化为RGB映射后,再保存;或者,如果只想保存为灰度图,则也必须使用convert('L')进行转换后,再保存就可以了具体代码如下:array = np.arra.._pil只能保存灰度图像吗

关于重装系统后开始菜单栏anaconda3文件夹消失问题的解决办法_开始菜单没有anaconda3-程序员宅基地

文章浏览阅读2.6k次。关于重装系统后开始菜单栏anaconda3文件夹消失问题的解决办法问题描述:初次安装成功,各项功能都可正常使用。重装系统后想要使用anaconda prompt安装扩展包,却发现连anaconda文件夹都没有。解决过程:查看了其他人的解决办法,大致有以下几种:1.python .\Lib\_nsis.py mkmenus2.conda update menuinstconda install -f console_shortcut ipython ipython-notebook ipython-_开始菜单没有anaconda3

signature=82fc81989e4b7cdba7f16c3353e0437e,英语翻译=E5=B0=8A=E6=95= =AC=E7=9A=84=E7=A5=9D=E5=85=88=E7=94...-程序员宅基地

文章浏览阅读708次。=E3=80=80=E3=80=80=E6=89=BF=E8=92=99=E8=B4=B5==E5=85=AC=E5=8F=B8=E5=AF=B9=E6=9C=AC=E4=BA=BA=E7=9A=84=E4=BF=A1=E4=BB=BB=E4==B8=8E=E9=82=80=E8=AF=B7=EF=BC=8C=E8=B0=A8=E8=A1=A8=E4=B8=87=E5=88=86=E6=84==9..._8b=e9=9d

解决IDEA的Range [0, 3) out of bounds for length 2错误-程序员宅基地

文章浏览阅读1.4k次。idea显示Range [0, 3) out of bounds for length 2_range [0, 3) out of bounds for length 2

555定时器-程序员宅基地

文章浏览阅读431次。定时器是一种多用途的数字-模拟混合集成电路,可极方便的构成施密特触发器、单稳态触发器和多谐振荡器,其简化原理图及引脚定义如下所示3个绿色电阻,电阻值为5K;2个黄色和粉色比较器;1个紫色SR触发器;1个蓝色放电三极管引脚定义PINNAMEI/O1GNDGround2TRIGITRIG _555定时器

推荐文章

热门文章

相关标签