STL中vector的使用你了解吗

目录
  • 前言
  • 1.vector是什么
  • 2.vector创建对象
  • 3.遍历vector
    • (1)下标遍历
    • (2)迭代器遍历
    • (3)范围for遍历
  • 3.vector容量函数
  • 4.vector的扩容函数
  • 5.vector的插入删除
    • (1)尾插与尾删
    • (2)insert与erase
    • (3)clear
      • vector的特殊应用
  • 6.总结

前言

当我们使用C语言的语法来实现数组的时候,增删查改都需要自己来定义函数,STL中给出了数组模板vector,其中包含函数可以帮助我们更便捷地处理数组。

1.vector是什么

1.vector是一个表示可变大小数组的容器。

2.vector采用连续存储空间来进行元素的存储。

3.vector使用动态分配数组来存储它的元素。

2.vector创建对象

以下为vector的四种拷贝构造函数。

    vector<int> v1;//创建空对象v1
	vector<int> v2(10, 8);//创建有十个8的对象v2
	vector<int> v3(++v2.begin(), --v2.end());//通过迭代器进行拷贝构造,迭代器可以加减操作
	vector<int> v4(v3);//拷贝构造
	string s("hello world");
	vector<char> v5(s.begin(), s.end());

vector创建对象的过程也就是它调用其构造函数和拷贝构造的过程,我们也可以将s中字符串存入容器v5中。
注意vector<char>不能取代string,这是因为使用vector<char>需要手动打印’\0’,并且vector也不支持+=和比较大小等一系列的操作。

3.遍历vector

为了更好地演示,我们先定义一个数组,并向其中传入数据。

vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.push_back(5);

(1)下标遍历

下标遍历可读可写。

	for (int i = 0; i < v.size(); i++)
	{
		v[i] += 1;//可以修改,因为返回的值是引用
		cout << v[i] << endl;
	}

(2)迭代器遍历

vector&lt;int&gt;::iterator it = v.begin();while (it != v.end()){*it -= 1;cout &lt;&lt; *it &lt;&lt; " " ;++it;}

(3)范围for遍历

	for (auto& e: v)
	{
		cout << e << " ";
	}

原生指针就是天然的迭代器,数组支持范围for会被替换成指针。

3.vector容量函数

表示vector容量的函数一共有三个。

	cout << v2.size() << endl;
	cout << v2.capacity() << endl;
	cout << v2.max_size() << endl;

v2.size()表示的是目前元素个数。

v2.capacity()表示的是最大容量。

v2.max_xize()表示的是系统可以分配的给vector<int>的最大容量(还未分配)。

如果内存是一个图书馆的话,vector<int>表示的是一个书架,size()就表示书架上放了多少书,capacity()表示的就是书架的最大容量,max_size表示的是图书馆中最大能放一个容量为多大的书架。

4.vector的扩容函数

我们使用vector的时候通常也是在堆上开辟空间的。这就需要用到两个函数,reseveresize,其使用方法和string的一样,reserve只开空间不初始化,resize开空间而且还初始化,不传初始化内容默认为0。

	vector<int> v2(10,45);//创建有十个8的对象v2
	cout << v2.size() << endl;
	cout << v2.capacity() << endl;
	v2.reserve(20);
	cout << v2.size() << endl;
	cout << v2.capacity() << endl;

resize需要借助调试来观察初始化的内容:

通过调试我们可以看到新开辟的空间里都初始化成了0。

我们还可以通过assign函数来将之前的内容进行覆盖。

	vector<int> v1;//创建空对象v1
	vector<int> v2(10,45);//创建有十个8的对象v2
	v2.assign(20, 5);

5.vector的插入删除

(1)尾插与尾删

插入删除主要使用四个函数:

尾插:push_back

尾删:pop_back

定点插入:insert

定点删除:erase

删除所有数据:clear

	vector<int> v1;//创建空对象v1
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);
	for (auto& e: v1)
	{
		cout << e << " ";
	}

pop_back这里就不演示了,就是一个简单的尾删。

(2)insert与erase

insert与erase是最容易引起迭代器失效的两个函数,关于迭代器失效的原理我会在下一节vector的模拟实现中详细解释。现在只需要记住string与vector迭代器失效的两种情况即可:

1.如果空间被重新分配,则指向容器的迭代器、指针和引用都会失效。

2.如果空间没被重新分配,指向插入位置之前的元素的迭代器、指针和引用依然有效,但指向插入位置之后元素的带带器、指针和引用将会失效。

注意,这里的迭代器指的是我们自己定义的迭代器。

	vector<int>::iterator ret = v1.begin();
	v1.insert(ret, 0);//在ret处插入0

我们可以通过insert来进行插入元素。

但当我们进行删除的时候,如果这样写程序会报错的。

	vector<int>::iterator ret = v1.begin();
	v1.insert(ret, 0);
	v1.erase(ret);

这是因为我们对v1进行了插入数据,空间被重新分配了,原有的ret失效了。如果要删除首元素,需要使用v1.begin()来删除。

为了保险起见,使用插入或者删除的操作之后,一定要记得更新迭代器。

(3)clear

clear会删除所有数据,注意一点,删除数据不会删除容量。

vector的特殊应用

vector<vector <int>>

表示一个二维数组,vector本身就是一个模板类型,里面也可以存放一个vector<int>的类型。

相当于vector本身是一个数组,它的每个数据又是一个int类型的数组。

vector<string>

表示数组中每一个元素都是一个字符串。

6.总结

vector的基本函数都介绍完了,这些已经足够我们使用了,如果知识在精不在多,如果还希望了解更过vector的成员函数的话,可以登录cplusplus.com来进行搜索。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C++ STL中vector容器的使用

    目录 一.vector (1)区分size()和capacity() (2)迭代器失效 (3)区分const_iterator和constiterator (4)区分reserve()和resize() (5)push_back和emplace (6)关于原位构造(定位new+完美转发) 总结 一.vector (1)区分size()和capacity() size():返回容纳的元素个数 capacity():返回当前分配存储的容量 (2)迭代器失效 (3)区分const_iterator和c

  • C++ STL标准库std::vector的使用详解

    目录 1.简介 2.使用示例 3.构造.析构.赋值 3.1std::vector::vector构造函数 3.2std::vector::~vector析构函数 3.3std::vector::operator=“=”符号 4.Iterators迭代器 4.1std::vector::begin 4.2std::vector::end 4.3std::vector::rbegin 4.4std::vector::rend 4.5std::vector::cbegin(C++11) 4.6std:

  • C++(STL库)之顺序容器vector的使用

    一.特点 ①总的来说:可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢 ②元素保存在连续的内存空间中,因此通过下标取值非常快 ③在容器中间位置添加或删除元素非常耗时 ④一旦内从重分配,和原vector相关的指针,引用,迭代器都失效.内存重分配耗时很长 二.头文件.using声明 头文件:#include <vector> using声明:using std::vector; 三.初始化 vector<T>  v1; ==>v1是一个空的vector ve

  • C++ STL入门教程(1) vector向量容器使用方法

    一.简介 Vectors 包含着一系列连续存储的元素,其行为和数组类似. 访问Vector中的任意元素或从末尾添加元素都可以在O(1)内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是O(N). 二.完整程序代码 /*请务必运行以下程序后对照阅读*/ #include <vector> #include <iostream> #include <algorithm> #include <stdexcept> using namespace

  • 关于STL中vector容器的一些总结

    1.vector的简单介绍 vector作为STL提供的标准容器之一,是经常要使用的,有很重要的地位,并且使用起来也是灰常方便.vector又被称为向量,vector可以形象的描述为长度可以动态改变的数组,功能和数组较为相似.实际上更专业的描述为:vector是一个多功能的,能够操作多种数据结构和算法的模板类和函数库,vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.(注:STL的容器从实现的

  • STL中vector的使用你了解吗

    目录 前言 1.vector是什么 2.vector创建对象 3.遍历vector (1)下标遍历 (2)迭代器遍历 (3)范围for遍历 3.vector容量函数 4.vector的扩容函数 5.vector的插入删除 (1)尾插与尾删 (2)insert与erase (3)clear vector的特殊应用 6.总结 前言 当我们使用C语言的语法来实现数组的时候,增删查改都需要自己来定义函数,STL中给出了数组模板vector,其中包含函数可以帮助我们更便捷地处理数组. 1.vector是什

  • 深入解析C++ STL中的常用容器

    STL是C/C++开发中一个非常重要的模板,而其中定义的各种容器也是非常方便我们大家使用.下面,我们就浅谈某些常用的容器.这里我们不涉及容器的基本操作之类,只是要讨论一下各个容器其各自的特点.STL中的常用容器包括:顺序性容器(vector.deque.list).关联容器(map.set).容器适配器(queue.stac). 1.顺序性容器 (1)vectorvector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问.由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢

  • 关于STL中set容器的一些总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入.排序.删除.查找等.让用户在STL使用过程中,并不会感到陌生. 关于set,必须说明的是set关联式容器.set作为一个容器也是

  • STl中的排序算法详细解析

    1. 所有STL sort算法函数的名字列表: 函数名    功能描述 sort   对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 partial_sort_copy    对给定区间复制并排序 nth_element 找出给定区间的某个位置对应的元素 is_sorted               判断一个区间是否已经排好序 partition     使得符合某个条件的元素放在前面 stable_pa

  • C++中vector容器的常用操作方法实例总结

    1 获得容器最后一个元素  ------ 使用 back或rbegin 取得 // back.rbegin 有常量和引用两种形式 std::vector<int> myVector; myVector.back()=3; std::vector<int>::reverse_iterator tailIter; tailIter=myVector.rbegin(); *tailIter=3 2 删除某元素 需要删除某位置的元素,应使用iterator遍历, 不应使用at(i) 方式遍

  • 关于STL中的map容器的一些总结

    一.关于map的介绍 map是STL的一个容器,和set一样,map也是一种关联式容器.它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据.这里说下map内部数据的组织,map内部是自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的.学习map我们一定要理解什么是一对一的数据映射?比如:一个班级中,每个学生的学号跟他的姓名就存

  • C++ STL中的容器适配器实现

    1 stack 1.1 stack 介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作.back:获取尾部元素操作.pus

  • C++ STL中常见的算法使用方式

    目录 什么是STL? 0. < algorithm> 是什么: 1. Non-modifying sequence operations: 1.1 find:(Find value in range) 1.2 count:(Count appearances of value in range) 1.3 equal:(Test whether the elements in two ranges are equal) 1.4 search:(Search range for subsequen

随机推荐