摘要:走近可以肤浅地理解成为灵活的数组,我们在定义数组的时候,是要确定数组的大小的。在内部,向量使用一个动态分配的数组来存储它们的元素。当插入新元素时,为了增加数组的大小,可能需要重新分配数组,这意味着分配一个新数组并将所有元素移动到该数组中。
hello,大家好,这期文章我们来介绍STL库中的vector,望对大家有所帮助。下面,让我们一起来走近它吧。
vector可以肤浅地理解成为灵活的数组,我们在定义数组的时候,是要确定数组的大小的。而vector却可以根据需要灵活地改变大小。
这是C++官网中对于vector的描述,翻译过来是:
向量是表示数组的序列容器,数组的大小可以改变。就像数组一样,vector使用连续的存储位置来存储其元素,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,这和在数组中一样有效。但与数组不同的是,它们的大小可以动态更改,其存储由容器自动处理。在内部,向量使用一个动态分配的数组来存储它们的元素。当插入新元素时,为了增加数组的大小,可能需要重新分配数组,这意味着分配一个新数组并将所有元素移动到该数组中。就处理时间而言,这是一项相对昂贵的任务,因此,vector不会在每次向容器添加元素时重新分配。相反,vector容器可能会分配一些额外的存储空间来容纳可能的增长,因此容器的实际容量可能会大于包含其元素所严格需要的存储空间(即其大小)。库可以实现增长不同的策略来平衡内存使用和重新分配,但在任何情况下,重新分配应该只发生在对数生长间隔的大小,以便插入单个元素的向量可以提供平摊常数时间复杂度(见push_back方法)。因此,与数组相比,向量消耗更多的内存,以换取管理存储和以有效方式动态增长的能力。与其他动态序列容器(deque、lists和forward_lists)相比,vector容器访问其元素非常高效(就像数组一样),从其末端添加或删除元素也相对高效。对于在非末端位置插入或删除元素的操作,它们的性能比其他操作差,迭代器和引用的一致性也比list和forward_lists差。
vector<对象类型>对象名
尖括号用来指定对象类型,后面为定义的对象的名称。
vector<int>a;vector<double>a;
这两个例子分别为定义一个int型的向量和定义一个double型的向量。
//无参构造 vector<int>v1; //构造并初始化n个nal; vector<int>v2(10, 0); //拷贝构造 vector<int>v3(v2); //迭代器初始化 vector<int>v4(v2.begin(), v2.end());
我们在这里展示三种遍历操作。
#include #include using namespace std;int main(){ vector<int>v1(10, 0); //遍历1 for (size_t i = 0; i < v1.size(); ++i) { cout << v1[i] << " "; } cout << endl; //遍历2 vector<int>::iterator it1 = v1.begin(); while (it1 != v1.end()) { cout << *it1 << " "; ++it1; } cout << endl; //遍历3 for (auto e : v1) { cout << e << " "; } cout << endl;}
#include #include using namespace std;int main(){ vector<int>v1(10, 0); vector<int>v2; //数据个数 cout << v1.size() << endl; //容量 cout << v1.capacity() << endl; //判断是否为空,非空为1,空为0 cout << v1.empty() << endl; cout << v2.empty() << endl; //改变vector的size //第一个参数为改变后的个数,第二个为新增个数的元素 v1.resize(15, 1); cout << v1.size() << endl;; for (auto e : v1) { cout << e << " "; } cout << endl; //改变容量 cout << v1.capacity() << endl; v1.reserve(20); cout << v1.capacity() << endl;}
#include #include using namespace std;int main(){ vector<int>v1; //尾插 v1.push_back(1); v1.push_back(2); v1.push_back(3); v1.push_back(4); for (auto e : v1) { cout << e << " "; } cout << endl; //尾删 v1.pop_back(); for (auto e : v1) { cout << e << " "; } cout << endl; //查找 vector<int>::iterator pos = find(v1.begin(), v1.end(), 3); cout << *pos << endl; //插入 v1.insert(pos, 0);//在pos位置前插入0 for (auto e : v1) { cout << e << " "; } cout << endl; //删除 v1.erase(pos);//删除pos位置的元素 for (auto e : v1) { cout << e << " "; } cout << endl; //交换 vector<int>v2(5, 0); vector<int>v3(5, 1); v2.swap(v3); for (auto e : v2) { cout << e << " "; } cout << endl; for (auto e : v3) { cout << e << " "; } cout << endl; //像数组一样访问 v1[1] = 100; for (auto e : v1) { cout << e << " "; } cout << endl;}
好的,在这篇文章中,我们介绍了vector的一些用法,希望对大家有所帮助。这个系列的文章最后都是要分享一首诗的,今天我们来分享陈年喜的炸裂志
早晨起来 头像炸裂一样疼这是大机器的额外馈赠不是钢铁的错是神经老了 脆弱不堪我不大敢看自己的生活它坚硬 铉黑有风镐的锐角石头碰一碰 就会流血我在五千米深处打发中年我把岩层一次次炸裂借此 把一生重新组合我微小的亲人 远在商山脚下他们有病 身体落满灰尘我的中年裁下多少他们的晚年就能延长多少我身体里有炸药三吨他们是引信部分就在昨夜 在他们床前我岩石一样 轰地炸裂一地
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/119813.html
摘要:拷贝构造函数示例构造无参构造函数总结容器和容器的构造方式几乎一致,灵活使用即可赋值操作功能描述给容器进行赋值函数原型重载等号操作符将区间中的数据拷贝赋值给本身。清空容器的所有数据删除区间的数据,返回下一个数据的位置。 ...
摘要:比起和统一的迭代器和引用更好。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃即如果继续使用已经失效的迭代器,程序可能会崩溃。 ...
摘要:可以在接口文件中直接引用库里的内容,大大方便接口文件的编写。使用库里的这里先介绍方式通过创建出来的数组是数组的直接代理,非常底层和高效,但是,它也和数组一样不安全,一样没有边界检查。对由于这种情况,可以使用库里的。 如果你也像我们一样,同时使用Python和C++,以获得两种语言的优势,一定也会希望寻找一种好的方式集成这两种语言,相比而言,让Python能够方便使用C++的库更加重要,...
摘要:支持绑定大多数的结构,包括和中引入的。枚举支持枚举和枚举类。虽然还有进一步优化的空间,但到目前为止,它在实际应用程序中的性能已经被证明是完全可以接受的。 翻译:云荒杯倾 Embind用于绑定C++函数和类到JavaScript,这样编译代码就能在js中以一种很自然的方式来使用。Embind也支持从C++调JavaScript的class。 Embind支持绑定大多数C++的结构,包括C...
阅读 3271·2021-09-30 09:47
阅读 2289·2021-09-10 10:51
阅读 1888·2021-09-08 09:36
阅读 2924·2019-08-30 12:56
阅读 3026·2019-08-30 11:16
阅读 2621·2019-08-29 16:40
阅读 2993·2019-08-29 15:25
阅读 1630·2019-08-29 11:02