c++ stl里的向量vector非常好用,那么它是怎么实现的呢
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ stl里的向量vector非常好用,那么它是怎么实现的呢相关的知识,希望对你有一定的参考价值。
这个要去翻源码了,STL里的代码说实话,真的看不太懂。
如果不是太纠结于具体细节,可以简单讲讲基本的实现思路,大致如下:
vector从功能上来讲,属于顺序存储容器,所以底层实现一般基于数组。
vector使用模板元编程技术实现,具体一点就是编译器根据使用时指定的实际类型在编译时执行模板特化,编译出对应的代码。也就是说vector<int> v1; vector<double>v2;它们各对应一个特化版本的代码。这提高了代码的抽象级别,但是对带来了代码膨胀的问题。
vector的重要特性之一就是实现了数组的动态递增。简单来说就是容器内部记录当前的足最大容量和使用量。当添加元素的时候,如果容器类发现当前的容量已耗尽,容器类会自动地重新分配一个更大容量的数组,把当前的所有元素copy过去,然后释放掉旧的数组,从而实现动态自增,这一切对使用者来说完全透明。
vector提供迭代器来提供统一的遍历访问接口,方便与STL中的其它组件进行交互。
这其中会有很多的细节,比如:
1. 是否允许vector在必要时缩小自身容量?
2. vector容量耗尽后的递增量是多少?
3. 是否应该提供线程安全容器?
有些东西可能真的需要去翻源码去看才能搞明白。或者可以参考侯捷的《STL源码剖析》。其实vector本身的实现并不会太复杂,它的实现思路也很简单,但是设计层面的一些取舍就需要经过仔细考量了。一般来说,STL是一个足够坚实的后盾,我们会频繁地使用它,以构建健壮高效的软件。能够理解STL里的一些设计思想和实现方式,对提高我们的编程思维和编程能力会所帮助。
插入:如果内存不够,则申请一块更大的,拷贝数据,将原有内存释放,再插入;插入中间则是先将插入后的数据向后移动一个位置,再在位置插入。
删除:则是后边的数据前移一个位置
清空:循环删除
还有list类似双向链表,vector和list的优缺点与数组和双向链表一样,自己根据情况使用。 参考技术B 用类和模板技术实现的。
在 C++ 中的向量中查找() stl
【中文标题】在 C++ 中的向量中查找() stl【英文标题】:find() stl in vector in c++ 【发布时间】:2020-01-05 19:02:53 【问题描述】:今天我试图在没有二进制搜索代码的向量中找到一个元素的位置,我发现有 find() stl 我实现了它并且它正在编译但它没有给出正确的输出
这是我的代码:
#include <bits/stdc++.h>
using namespace std;
int main()
int n;
vector<int> a(0);
a.push_back(6);
a.push_back(3);
a.push_back(9);
a.push_back(5);
a.push_back(1);
vector<int> :: iterator b;
b = find(a.begin() , a.end() , 3);
cout << (a.end() - b); // output is 4
return 0;
我应该怎么做才能获得向量中任何元素的位置? 谢谢
【问题讨论】:
请阅读Why should I not #include <bits/stdc++.h>?以及Why is “using namespace std;” considered bad practice? 【参考方案1】:试试
std::cout << (b - a.begin());
或者,甚至更好,
std::cout << std::distance(a.begin(), b);
(a.end() - b)
计算找到的元素到向量末端的距离,实际上是4。
【讨论】:
以上是关于c++ stl里的向量vector非常好用,那么它是怎么实现的呢的主要内容,如果未能解决你的问题,请参考以下文章