vector容器 常用函数

这篇具有很好参考价值的文章主要介绍了vector容器 常用函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vector的介绍

vector是STL(标准模板库)中最常见的容器,它是一种顺序容器,支持随机访问。可以用sort对其进行排序,底层数据结构是数组,可以随机访问元素。

vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。

vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。

访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。

注:如果要使用vector,则需要添加vector头文件,即#include,除此之外,还需要添加using namespace std;

vector的定义

C++中构造vector可以使用以下任意一种参数方式:

语法:

1.vector();
无参数 - 构造一个空的vector

2.vector(size_type num, const TYPE &val);
数量(num)和值(val) - 构造一个初始放入num个值为val的元素的Vector

举例,假如构造一个包含3个值为4的vector
vector v1(3,4);

3.vector(const vector &from);
vector(from) - 构造一个与vector from 相同的vector

4.vector(input_iterator start, input_iterator end);
迭代器(start)和迭代器(end) - 构造一个初始值为[start,end)区间元素的Vector(注:半开区间)

#include<iostream>
#include <vector>

using namespace std;
int main() {
	vector<int> sdt;//无参构造
	vector<int>  s1(4,100);//构造并初始化4个100
	vector<int> s2(s1.begin(), s1.end());//使用迭代器进行初始化构造
	vector<int> s3(s1);//拷贝构造
	return 0;
}

vector函数,C++,c++,算法

访问vector容器内元素的方法

1.通过下标访问

和访问普通的数组是一样的,对一个定义为vector v的vector容器,直接使用v[index]访问即可,其中index∈[0,v.size()−1]

2.通过迭代器访问

迭代器可以理解为一种类似指针的东西

vector::iterator it;定义迭代器,得到了迭代器it之后,可以通过*it来访问vector中的元素

3.v[i]和*(v.begin()+i)是等价的

4.迭代器来实现了两种自加操作和自减操作

5.begin()函数的作为是为取v的首元素地址,end()函数并不是为了取v的尾元素地址,而是取尾元素地址的下一个地址。它作为迭代器末尾标志,不储存任何元素

6.在常用STL容器中,只有在vector和string中,才允许使用v.begin()+3这种迭代器加上整数的写法

vector常用函数

vector常用函数的时间复杂度:

push_back(),时间复杂度为O(1)
pop_back(),时间复杂度为O(1)
size(),时间复杂度为O(1)
clear(),时间复杂度为O(N)
insert(),时间复杂度为O(N)
erase(),时间复杂度为O(N)

vector常用函数解读:

push_back(x)就是在vector后面添加一个元素x

pop_back()用于删除vector的尾元素

size()用来获得vector中元素的个数,返回的是unsigned类型,不过一般来说用%d不会出很大问题,这一点对所有STL容器都是一样的

clear()用来清空vector中的所有元素

insert(it,x)用来向vector的任意迭代器it处插入一个元素x

erase():

        删除单个元素,erase(it)即删除迭代器为it处的元素。

        删除一个区间内的所有元素,erase(first,last)即删除[first,last)内的所有元素

        清空vector也可以使用v.erase(v.begin(),v.end())

其他相关函数:
vector函数,C++,c++,算法

vector对象的几个重要操作,举例说明如下:
(1)a.assign(b.begin(), b.begin()+3);//b为向量,将b的0~2个元素构成的向量赋给a2)a.assign(4,2);//是a只含4个元素,且每个元素为23)a.back();//返回a的最后一个元素4)a.front();//返回a的第一个元素5)a[i]; //返回a的第i个元素,当且仅当a[i]存在6)a.clear();//清空a中的元素7)a.empty();//判断a是否为空,空则返回ture,不空则返回false8)a.pop_back();//删除a向量的最后一个元素9)a.erase(a.begin()+1,a.begin()+3);//删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)10)a.push_back(5);//在a的最后一个向量后插入一个元素,其值为511)a.insert(a.begin()+1,5);//在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,412)a.insert(a.begin()+1,3,5);//在a的第1个元素(从第0个算起)的位置插入3个数,其值都为513)a.insert(a.begin()+1,b+3,b+6);//b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,814)a.size();//返回a中元素的个数;15)a.capacity();//返回a在内存中总共可以容纳的元素个数16)a.rezize(10);//将a的现有元素个数调至10个,多则删,少则补,其值随机17)a.rezize(10,2);//将a的现有元素个数调至10个,多则删,少则补,其值为218)a.reserve(100);//将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才 显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能) 19)a.swap(b);//b为向量,将a中的元素和b中的元素进行整体性交换20)a==b; //b为向量,向量的比较操作还有!=,>=,<=,>,<

部分函数用法示例:

#include <vector>
#include <iostream>

using namespace std;

int main()
{
    typedef vector<int> vecInt;
    vecInt vecint;
    // 添加数据
    for (int i = 0; i < 5; i++)
    {
        vecint.push_back(i+1);
    }

    // 遍历元素
    vecInt::iterator it;
    cout << "vecint is: " << endl;
    for (it = vecint.begin(); it != vecint.end(); it++)
    {
        cout << *it << endl;
    }

    // 查询数据
    cout << "the second element is: " << vecint.at(1) << endl;

    // 删除数据,删除最后一个元素
    it = vecint.end();
    it = it - 1;                // 需要注意,(it - 1)对应最后一个元素
    vecint.erase(it);

    // 再次遍历元素,观察删除操作是否成功
    cout << "after del, vecint is: " << endl;
    for (it = vecint.begin(); it != vecint.end(); it++)
    {
        cout << *it << endl;
    }

    // 插入数据,在最后一个元素之前插入数据
    it = vecint.end();
    it = it - 1;
    vecint.insert(it, 100);   

    // 再次遍历元素,观察插入操作是否成功
    cout << "after insert, vecint is: " << endl;
    for (it = vecint.begin(); it != vecint.end(); it++)
    {
        cout << *it << endl;
    }  
   
   // auto遍历  
   for (auto x: vecint) {
		cout << x << " ";
	 }

    return 0;
}

上述代码的运行结果如下:
vector函数,C++,c++,算法

vector的其他用法

1.动态数组不仅仅可以储存基本的数据类型,还能储存自定义数据类型,比如结构体。

2.通常可以采用下面的方式使用vector定义二维数组:

vector<vector<int>> vecvec = {{1, 2, 8}, {2, 4, 9}, {4, 7, 10}, {6, 8, 11}};

3.对于vector可能会导致其迭代器失效的操作有:
会引起其底层空间改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等。
说明: 出错原因:以上操作,都有可能会导致vector扩容,也就是说vector底层原理旧空间被释放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,实际操作的是一块已经被释放的空间,而引起代码运行时崩溃。
解决方式:在以上操作完成之后,如果想要继续通过迭代器操作vector中的元素,只需给it重新赋值即可。文章来源地址https://www.toymoban.com/news/detail-831970.html

到了这里,关于vector容器 常用函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STL : vector 矢量容器

    目录 Vector Capacity Elements access Modifiers Allocator Non-member Notice overloads Template specializations #includevector    using namespace std; 矢量容器 :单向开口的连续内存空间,底层封装:数组; 预留内存空间不够时,可以动态扩展(容器满了则新建容器同时进行拷贝); 顺序序列:容器元素按

    2023年04月15日
    浏览(32)
  • C++---vector容器

    是STL容器中的一种常用的容器,由于其大小(size)可变,常用于数组大小不可知的情况下来替代数组。vector容器与数组十分相似,被称为动态数组。时间复杂度为O(1)。 数组数据通常存储在栈中,vector数据通常存储在堆中。 动态扩展不是在原空间后加入空间,而是寻找更大空

    2024年04月14日
    浏览(27)
  • Vector容器的详细介绍

    1.1 功能:   -vector 数据结构和数组非常相似,也称单端数组 1.2 vector与普通数组区别:   - 不同之处在于数组是静态空间,而vector可以动态拓展 1.3 动态拓展:   并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。   vector容

    2024年01月23日
    浏览(32)
  • C++中的vector容器

      vector是封装动态数组的顺序容器。   就像数组一样,vector也采用的连续存储空间来存储元素。这也就意味着我们可以通过下标来获取vector的元素,和数组一样高效。但是又不像数组,vector的大小是可以动态改变的,且它的大小会被容器自动处理。   本质上,vector使

    2023年04月24日
    浏览(37)
  • C++提高编程——STL:string容器、vector容器

    本专栏记录C++学习过程包括C++基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下, 不定时更新,欢迎关注 。 当前章节处于: ---------第1阶段-C++基础入门 ---------第2阶段实战-通讯录管理系统, ---------第3阶段-C++核心编程, -----

    2024年01月23日
    浏览(32)
  • 【C++】vector容器初步模拟

    送给大家一句话: 努力一点,漂亮—点,阳光一点。早晚有一天,你会惊艳了时光,既无人能替,又光芒万丈。 今天我我来进行vector的模拟实现,先简单的实现一下初步功能,使其对内置类型可以适配。(大部分与string很类似) vector是表示 可变大小数组 的序列容器。 就像

    2024年04月08日
    浏览(73)
  • Vector容器(黑马程序员)

    视频与文档链接 功能: vector数据结构和 数组非常相似 ,也称为 单端数组 普通数组一旦分配内存,容量就被固定了,无法扩展。 vector与普通数组区别: 不同之处在于数组是静态空间,而vector可以 动态扩展 动态扩展: 并不是在原空间之后续接新空间,而是找更大的内存空

    2024年02月08日
    浏览(32)
  • C++ 算法基础(1)——cmath常用函数

    头文件声明了一组用于计算常见数学运算和转换的函数: cos(x):计算余弦。 返回x弧度角的余弦值。 The cosine of 60.000000 degrees is 0.500000. sin(x):计算正弦。 返回x弧度角的正弦值。 The sine of 30.000000 degrees is 0.500000. tan(x):计算正切。 返回x弧度角的正切值。 The tangent of 45.000000 de

    2024年02月08日
    浏览(22)
  • Day 23 C++ vector容器

    定义 C++的vector容器是一个动态数组,提供了存储和操作元素的功能。它是标准模板库(STL)的一部分,在头文件中定义。 vector数据结构和 数组非常相似 ,也称为 单端数组 ( 动态数组 )( 也被称为向量 ) 使用vector容器前,需要引入头文件: vector容器的迭代器——支持随

    2024年02月14日
    浏览(20)
  • 【C++第三阶段】vector容器

    以下内容仅为当前认识,可能有不足之处,欢迎讨论! vector函数是常用数据结构,见于刷题网站。 它是单端数组,与普通数组区别在于可以动态扩展。 动态扩展是编译器自动的,不是在原空间之后续接新空间,而是找更大的内存空间,将原数据拷贝新空间,释放原空间。

    2024年04月10日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包