首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Vector :: push_back()中的C++好奇行为

在C++中,std::vector是一个动态数组,它可以自动调整大小以容纳新元素。push_back()std::vector的一个成员函数,用于在向量的末尾添加一个新元素。以下是关于std::vector::push_back()的一些好奇行为:

  1. 性能push_back()操作的时间复杂度为O(1),即它的执行时间与向量的大小无关。这是因为std::vector在内部实现时,预留了一些额外的空间,以便在添加新元素时不需要频繁地重新分配内存。
  2. 自动扩容:当std::vector的容量不足以容纳新元素时,它会自动分配更大的内存空间,并将现有元素复制到新的内存位置。这种扩容机制可能会导致push_back()操作的时间复杂度变为O(n),其中n为向量中的元素数量。然而,在实际应用中,这种情况很少发生,因为std::vector通常会预留一定的空间以减少扩容操作的次数。
  3. 容量与大小std::vector有两个属性,分别是容量(capacity)和大小(size)。容量表示当前分配的内存空间能够容纳的元素数量,而大小表示当前向量中实际存在的元素数量。在调用push_back()后,向量的大小会增加,但容量可能保持不变,或者增加一个预定义的值。
  4. 自定义分配器std::vector允许使用自定义分配器来管理内存。这意味着,在某些特定的场景下,可以优化push_back()操作的性能,例如通过使用内存池或其他内存管理策略。
  5. 异常安全:在某些实现中,push_back()操作可能会抛出异常,例如当向量无法分配足够的内存空间时。为了确保程序的稳定性,建议在使用push_back()时检查容量是否足够,或者使用异常处理机制来捕获可能的异常。

总之,std::vector::push_back()是一个高效、易用的操作,可以方便地在向量的末尾添加新元素。然而,在使用它时,也需要注意内存管理和异常处理等方面的问题,以确保程序的稳定性和性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c++vector用法详解_vector>初始化

vectorC++ STL一个重要成员,使用它时需要包含头文件: #include; 一、vector初始化 (1) vector a(10); //定义了10个整型元素向量...(尖括号为元素类型名,它可以是任何合法数据类型),但没有给出初值,其值是不确定。...//b为向量,将a元素和b元素进行整体性交换 (20)a==b; //b为向量,向量比较操作还有!...=,>=,,< 三、顺序访问vector几种方式,举例说明如下: (1)向向量a添加元素 1、利用push_back() vector a; for(int i=0;i<10;i+...刚开始我也犯过这种错误,后来发现,下标只能用于获取已存在元素,而现在a[i]还是空对象 (2)从向量读取元素 1、通过下标方式读取 int a[6]={ 1,2,3,4,5,6}; vector

1K40

c++vector以及vector模拟实现

/reference/vector/vector/ vector在实际中非常重要,在实际我们熟悉常见接口就可以,下面列出了哪些接口是要重点掌握 2.1 vector定义 2.2 vector...解决方式:在以上操作完成之后,如果想要继续通过迭代器操作vector元素,只需给it重新 赋值即可。 */ while (it !...因此删除vector任意位置上元素时,vs就认为该位置迭代器失效了 注意:Linux下,g++编译器对迭代器失效检测并不是非常严格,处理也没有vs下极端 从上述三个例子可以看到:SGI STL,...是浅拷贝,否则可能会引起内存泄漏甚至程序崩溃 3.2 动态二维数组理解 // 以杨慧三角前n行为例:假设n为5 void test2vector(size_t n) { // 使用vector定义二维数组...vv,vv每个元素都是vectorvector> vv(n); // 将二维数组每一行vecotr元素全部设置为1 for (size_t

4110

C++vector容器(保姆级讲解)

观看完黑马程序员C++讲解,在c++STLvector是非常重要容器,希望文章对你有所帮助 目录 一、vector基本概念 功能 vevtor与普通数组区别: 动态拓展: 二、vector...,通常不会在前端进行操作,可以在尾部通过push_back()插入数据,通过pop_back()  front()代表第一个元素                                                   ...五、vector插入和删除 功能描述 对vector容器进行插入,删除操做 函数原型 push_back(ele);                          //尾部插入ele pop_back...数据存取 功能描述 对vector数据存取操作 函数原型  at(int  idx);                //返回idx所指数据 operator[ ]                   ...//返回idx所指数据 front();                        //返回容器第一数据元素 back();                       //返回容器中最后一个数据元素位置

66510

c++vector使用

这个范围包括从 first 到 last 之间所有元素,但不包括 last 指向元素。这个构造函数可以用于复制任何其他容器(如 list、deque、甚至是另一个 vector元素。...resize不会进行缩容,如果想要缩容,我们可以调用shrink_to_fit(); 2.4vector增删查改 push_back push_back使用很简单,直接尾插一个元素即可...库是没有find函数,我们这里使用是算法库find,其是包含在头文件 这个函数是非成员函数,被用来在一个序列查找一个特定值。...find 函数会使用元素类型 operator== 来比较每个元素是否跟 val 相等 find 函数行为是线性搜索;它从 first 索引开始,逐个比较每个元素直到 last 索引之前,查找一个等于...:vector insert 方法用于在向量指定位置插入元素。

13410

C++Vector使用

一、vector介绍 vector文档介绍 1. vector是表示可变大小数组序列容器。 2. 就像数组一样,vector也采用连续存储空间来存储元素。...就时间而言,这是一个相对代价高任务,因为每当一个新元素加入到容器时候,vector并不会每次都重新分配大小。...4. vector分配空间策略:vector会分配一些额外空间以适应可能增长,因为存储空间比实际需要存储空间更大。不同库采用不同策略权衡空间使用和重新分配。...因此,vector占用了更多存储空间,为了获得管理存储空间能力,并且以一种有效方式动态增长。 6....下面我们用test2()来进行测试 void test2() { vector v1; //push_back v1.push_back(1); v1.push_back(2); v1

22910

c++vector向量几种情况总结(1)

1.标准库vector类型 vector 是同一种类型对象集合,每个对象都有一个对应整数索引值。标准库将负责管理与存储元素相关内存。我们把 vector 称为容器,是因为它可以包含其他对象。...一个容器所有对象都必须是同一种类型。 用 vector之前,必须包含相应头文件。...因此,我们可以定义保存 string 对象 vector,或保存 int 值 vector,又或是保存自定义类类型对象vector。使用类模板时只需要简单了解类模板是如何定义就可以了。...以 vector 为例,必须说明 vector 保存何种对象类型,通过将类型放在类模板名称后面的尖括号来指定类型: vector ivec; // ivec holdsobjects of...vector 类型每一种都指定了其保存元素类型。因此,vectorvector 都是数据类型。

1.4K30

C++vector基本使用

对于顺序表这种结构来说,头插和头删效率是非常低,所以vector只提供了push_back和pop_back,而难免遇到头插和头删情况时,可以偶尔使用insert和erase来进行头插和头删,并且...因为大多数容器都会用到查找接口,也就是find,所以C++直接将这个接口放到算法库里面去了,实现一个函数模板,这个函数实现实际也比较简单,只要遍历一遍迭代器然后返回对应位置迭代器即可,所以这个函数不单独作为某个类成员函数...vector类内swap用于两个对象交换,在swap实现里面再调用stdswap进行内置类型交换,但C++用心良苦,如果你不小心使用格式是std里面的swap格式的话,也没有关系,因为类外面有一个匹配...vectorswap,所以会优先调用类外swap,C++极力不想让你调用算法库swap,就是因为如果交换类型是自定义类型情况下,算法库swap会进行三次深拷贝,代价极大,所以为了极力防止你调用算法库...swap,C++不仅在类内定义了swap,在类外也定义了已经实例化好swap,调用时会优先调用最匹配swap。

84120

C++vector模拟实现

1.查看STL源码 start、finish、end_of_storage 都是指针 ---- 通过观察函数实现过程,可以得知 start与begin等价 ,end与finish等价 2.vector...模拟实现 为了模拟实现vector,所以使用自己名空间包含vector类 ---- 1....,所以使用 n>capacity() , 开辟一块空间tmp,将start数据拷贝到新空间,释放旧空间,指向新空间,同时更新_finish 和_end_of_storage 在计算_finish...,但若为自定义类型依旧会报错 因为自己实现拷贝构造memcpy也是一种浅拷贝(按字节拷贝) 深拷贝是重新开辟一块与原空间大小相同新空间,并将原空间数据拷贝给新空间,但是若为string 类型..., 再次使v1析构,依旧会析构字符串,所以会报错 属于深拷贝内浅拷贝 ---- 这样v1与v2_str都指向自己字符串,不会发生析构两次问题了 ---- 同样reserve也存在使用memcp

34310

C++Vector模拟实现

如果拷贝是自定义类型元素,memcpy既高效又不会出错,但如果拷贝是自定义类型元素,并且自定义类型元素涉及到资源管理时,就会出错,因为memcpy拷贝实际是浅拷贝。  ...如果对象涉及到资源管理时,千万不能使用memcpy进行对象之间拷贝,因为memcpy是 浅拷贝,否则可能会引起内存泄漏甚至程序崩溃。...因此删除 vector 任意位置上元素时,vs 就认为该位置迭代器失效了。 vs和g++对比  结果是未定义!!... Self;//Ref单纯是为了控制解引用时候是否可以被写 //利用反向迭代器类来封装正向迭代器,同时在类里面设置反向迭代器行为 ReverseIterator...,同时在类里面设置反向迭代器行为 ReverseIterator(iterator it) :_cur(it) {} Ref operator*() { iterator

7310

AndroidVector

终于,Android Vector 出现,可以解决这个问题了。 二、Vector是什么 我们在了解Vector之前,我们必须先了解SVG。...了解完SVG,再去了解Vector Drawable就更简单了,因为 Vector 就是 Android SVG 实现。...Vector是Android 5.0 之后才出来,不过从 AppCompat23.2 开始,Google开始支持在5.0版本以下使用Vector。...Vector Drawable 并不是支持所有 SVG 语法,但是支持语法已经足够使用。 三、Vector语法 因为 Vctor 是基于XML,所以是用代码编写。...Vctor属性: width:图形实际宽度 height:图形实际长度 viewportHeight:画布长度 viewportWidth:画布宽度 Vectorpath语法基本可以绘制出很多我们想要图像

1.5K40

C++初阶:适合新手手撕vector(模拟实现vector

上次讲了常用接口:C++初阶:容器(Containers)vector常用接口详解 今天就来进行模拟实现啦 1.基本结构与文件规划 vector.h头文件:包含类全部(函数声明与定义) test.cpp...如果当前容量小于 n,则会分配新内存空间,并将原来元素复制到新内存空间中。 首先,它会创建一个新大小为 n 临时数组 tmp,然后将原始数组元素复制到临时数组。...在这里为了妥协,其实内置类型也有构造函数在 C++ 。...迭代器失效意味着该迭代器不再指向有效元素或容器结尾,因此继续使用失效迭代器可能会导致未定义行为。...这是因为在赋值操作符我们会调用 swap 函数,按值传递可以保证传入参数会被复制一份,避免对原对象修改。

22310

C++ STD::VECTORRESIZE和RESERVE看VECTOR源码实现

与size()已经初始化空间 1. vector 特点 是连续空间 啥意思 提前已经分配好内存了(M_start,_M_end_of_storage)。就能解释下吗2个概念。...很多初学者分不清楚 vector 容器容量(capacity)和大小(size)之间区别,甚至有人认为它们表达是一个意思 混淆地方。...可分配空间是vector之外 思考60秒:vector(10,0) 执行过程 vector(10,0) 执行过程 a 执行_Vector_base构造函数 b 初始化size(10),调用对应构造函数...::reserve Request a change in capacity 第二步 查看 insert函实现 case1-a:对应源代码解析case1-a情况; case1-b:对应源码剖析...case1-b情况: 第三步:查看 push_back() push_back 函数:construct void push_back(const _Tp& __x) {//在最尾端插入元素

1.1K10
领券