STL vector小结

合集下载

stl常用函数

stl常用函数

stl常用函数STL(StandardTemplateLibrary)是C++标准库中的一个重要部分,它提供了许多常用的数据结构和算法,方便了程序员的开发工作。

在STL中,有许多常用的函数,本文将介绍一些常用的STL函数。

1. vectorvector是STL中最常用的容器之一,它是一个动态数组,可以方便地进行插入、删除等操作。

下面是一些常用的vector函数:1.1 push_backpush_back函数用于在vector的末尾添加一个元素,例如:```c++vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);```这样,vec中就包含了1、2、3这三个元素。

1.2 pop_backpop_back函数用于删除vector末尾的一个元素,例如:```c++vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);vec.pop_back();```这样,vec中就只包含了1、2这两个元素。

1.3 sizesize函数用于返回vector中元素的个数,例如: ```c++vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);cout << vec.size() << endl;```输出结果为3。

1.4 clearclear函数用于清空vector中的所有元素,例如: ```c++vector<int> vec;vec.push_back(1);vec.push_back(2);vec.push_back(3);vec.clear();```这样,vec就不包含任何元素了。

2. listlist是STL中另一个常用的容器,它是一个双向链表,可以方便地进行插入、删除等操作。

作业一:vector实验

作业一:vector实验

安徽财经大学实验报告
班级:学号:姓名: 实验成绩:
课程名称:stl和boost类库实验实验名称:vector类
实验地点:信息管理实验室日期: 4-14 时间: 19:00~20:30 教师:张林
说明:
1)实验原理简单介绍一下,不要超过300字。

2)姓名需要手签,成绩不要填写,其他如班级、学号、日期、时间可以机打。

3)实验内容包括多道题目。

如果题目较多,可以直接复制题目格式
4)每道题目包括:题目及目的、题目的描述、程序源代码、程序编译信息、测试结果与分析、题目小结等部分。

5)如果实验已经给出了源代码,可以不写。

如果你认为源代码存在问题,也可以写出指正。

源代码的核心部分,要给与注释。

6)如果有好的想法,一道题的源代码可以出现多份。

7)如果有的实验,我们只需要编译,修改程序的错误。

则需要程序编译,否则此栏可以删掉。

此栏需要复制出错误的信息(只复制错误信息的主要部分),同时给出错误的原因和修改方案。

8)如果程序有运行结果,则需要测试结果与分析;否则,可以删掉。

测试结果需要写入输入数据、输出数据和简单分析。

9)实验报告需要打印上交。

打印时,请把本说明删掉。

详解C++STLvector容量(capacity)和大小(size)的区别

详解C++STLvector容量(capacity)和大小(size)的区别

详解C++STLvector容量(capacity)和⼤⼩(size)的区别很多初学者分不清楚 vector 容器的容量(capacity)和⼤⼩(size)之间的区别,甚⾄有⼈认为它们表达的是⼀个意思。

本节将对 vector 容量和⼤⼩各⾃的含义做⼀个详细的介绍。

vector 容器的容量(⽤ capacity 表⽰),指的是在不分配更多内存的情况下,容器可以保存的最多元素个数;⽽ vector 容器的⼤⼩(⽤ size 表⽰),指的是它实际所包含的元素个数。

对于⼀个 vector 对象来说,通过该模板类提供的 capacity() 成员函数,可以获得当前容器的容量;通过 size() 成员函数,可以获得容器当前的⼤⼩。

例如:#include <iostream>#include <vector>using namespace std;int main(){std::vector<int>value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };value.reserve(20);cout << "value 容量是:" << value.capacity() << endl;cout << "value ⼤⼩是:" << value.size() << endl;return 0;}程序输出结果为:value 容量是:20value ⼤⼩是:15结合该程序的输出结果,图 1 可以更好的说明 vector 容器容量和⼤⼩之间的关系。

图 1 vector 容量和⼤⼩的区别显然,vector 容器的⼤⼩不能超出它的容量,在⼤⼩等于容量的基础上,只要增加⼀个元素,就必须分配更多的内存。

注意,这⾥的“更多”并不是 1 个。

c++向量的用法

c++向量的用法

c++向量的用法C++中的向量(Vector)是一种动态数组,它能够自动调整大小以适应不同的元素数量。

向量属于标准模板库(Standard Template Library,STL)的一部分,它提供了许多方便的函数和操作符,用于方便地处理和操作元素。

下面将介绍向量的用法及相关参考内容。

1. 定义和初始化向量向量的定义需要包含<vector>头文件,并使用std命名空间。

我们可以使用以下方式来定义和初始化向量:```cpp#include <vector>#include <iostream>int main() {// 定义一个整数类型的向量std::vector<int> v1;// 定义一个浮点类型的向量,初始容量为10std::vector<float> v2(10);// 定义一个字符串类型的向量,并初始化为{"Hello", "World"}std::vector<std::string> v3{"Hello", "World"};// 定义一个空向量,并指定初始容量为5std::vector<char> v4(5, 'a');// 输出向量中的元素for (int i : v1) {std::cout << i << " ";}std::cout << std::endl;for (float f : v2) {std::cout << f << " ";}std::cout << std::endl;for (std::string str : v3) {std::cout << str << " ";}std::cout << std::endl;for (char c : v4) {std::cout << c << " ";}std::cout << std::endl;return 0;}```参考内容:- 《C++ Primer Plus》- 《C++标准库-深度剖析》,侯捷- 《C++标准库速查表》2. 向向量中添加元素向量提供了几个函数来添加元素:- push_back(value):在向量的末尾添加一个元素;- insert(iterator, value):在指定位置插入一个元素;- emplace(iterator, args...):在指定位置使用参数构造一个元素;- insert(iterator, n, value):在指定位置插入n个元素;- insert(iterator, first, last):在指定位置插入另一个区间内的元素。

stl中vector用法

stl中vector用法

stl中vector用法《stl中vector用法》vector在STL里就像一个超级灵活的收纳盒。

它可以用来存放各种各样的数据,不管是整数、小数,还是自定义的结构体之类的东西,只要你想把一堆数据放在一起管理,vector就可能是个很棒的选择。

比如说你要记录一群人的年龄。

你可以创建一个vector来存放这些年龄数据。

在C++里,创建一个vector很简单,就像你准备一个新的收纳盒一样。

你可以这样写:`vector<int> ages;`,这里的`<int>`就表示这个vector是用来存放整数类型的数据的,也就是我们的年龄。

要是你想一开始就给这个vector里放几个年龄数据,也可以这么干:`vector<int> ages = {18, 20, 25};`,这就好比你在收纳盒一拿过来的时候就往里面放了几件东西。

往vector里添加数据就像是往收纳盒里放东西。

你可以用`push_back`这个方法。

比如说又知道了一个人的年龄是30岁,那就可以这样把这个年龄放到我们的ages这个vector里:`ages.push_back(30);`。

这就跟你从旁边拿起一件东西,然后轻松地放到收纳盒里一样自然。

那怎么把vector里的数据取出来呢?这也不难。

你可以像从收纳盒里拿东西一样,用索引的方式。

就好比收纳盒里的东西是按顺序放着的,vector里的数据也是有顺序的。

如果想拿到刚刚放进去的30岁这个年龄数据,你可以这么做:`int theAge = ages[ages.size() - 1];`。

这里`ages.size()`就是vector里数据的个数,因为索引是从0开始的,所以要减1才能拿到最后放进去的那个数据。

vector还有个好玩的地方,它的大小是可以动态变化的。

就像你的收纳盒是有弹性的一样,如果又有新的年龄数据要放进去,vector会自动调整自己的大小来容纳新的数据。

STL标准模板库向量容器(vector)

STL标准模板库向量容器(vector)

STL标准模板库向量容器(vector)向量容器使⽤动态数组存储、管理对象。

因为数组是⼀个随机访问数据结构,所以可以随机访问向量中的元素。

在数组中间或是开始处插⼊⼀个元素是费时的,特别是在数组⾮常⼤的时候更是如此。

然⽽在数组末端插⼊元素却很快。

实现向量容器的类名是vector(容器是类模板)。

包含vector类的头⽂件名是vector。

所以,如果要在程序⾥使⽤向量容器,就要在程序中包含下⾯语句:#include <vector>此外,在定义向量类型对象时,必须指定该对象的类型,因为vector类是⼀个类模板。

例如,语句:vector<int> intList;将intList声明为⼀个元素类型为int的向量容器对象。

类似地,语句:vector<string> stringList;将stringList声明为⼀个元素类型为string的向量容器对象。

声明向量对象vector类包含了多个构造函数,其中包括默认构造函数。

因此,可以通过多种⽅式来声明和初始化向量容器。

表⼀描述了怎样声明和初始化指定类型的向量容器。

表⼀各种声明和初始向量容器的⽅法语句作⽤vector<elementType> vecList; 创建⼀个没有任何元素的空向量vecList(使⽤默认构造函数)vector<elementType> vecList(otherVecList)创建⼀个向量vecList,并使⽤向量otherVecList中的元素初始化该向量。

向量vecList与向量otherVecList的类型相同vector<elementType> vecLIst(size);创建⼀个⼤⼩为size的向量vecList,并使⽤默认构造函数初始化该向量 vector<elementType>vecList(n,elem);创建⼀个⼤⼩为n的向量vecList,该向量中所有的n个元素都初始化为elemvector<elementType> vecList(begin,end);创建⼀个向量vecList,并初始化该向量(begin,end)中的元素。

STL容器简介

STL容器简介

STL容器简介stl不是⾯向对象的编程,⽽是⼀种不同的编程模式————泛型编程我们常⽤到的STL容器有vector、list、deque、map、multimap、set、multiset顺序性容器:vector、deque、list关联性容器:set、multiset、map、multimap容器适配器:stack、queueverctor vector类似于动态数组,直接访问元素,从后⾯快速插⼊或者删除; vector类似于C语⾔中的数组,它维护⼀段连续的内存空间,具有固定的起始地址,因⽽能⾮常⽅便地进⾏随机存取,即 [] 操作符,但因为它的内存区域是连续的,所以在它中间插⼊或删除某个元素,需要复制并移动现有的元素。

此外,当被插⼊的内存空间不够时,需要重新申请⼀块⾜够⼤的内存并进⾏内存拷贝。

值得注意的是,vector每次扩容为原来的两倍,对⼩对象来说执⾏效率⾼,但如果遇到⼤对象,执⾏效率就低了。

list 可以从任何地⽅插⼊或者删除; 类似于C语⾔中的双向链表,它通过指针来进⾏数据的访问,因此维护的内存空间可以不连续,这也⾮常有利于数据的随机存取,因⽽它没有提供 [] 操作符重载;deque 是⼀个double-ended queue 1)⽀持随即存取,也就是[]操作符, 2)⽀持两端操作,push(pop)-back(front),在两端操作上与list效率差不多stack 1)可⽤ vector, list, deque来实现 2)缺省情况下,⽤deque实现 template<classT, class Cont = deque<T> > class stack { ….. }; 3)⽤ vector和deque实现,⽐⽤list实现性能好 4)stack是后进先出的数据结构, 5)只能插⼊、删除、访问栈顶的元素的操作: push: 插⼊元素pop: 弹出元素 top: 返回栈顶元素的引⽤map map类似于数据库中的1:1关系,它是⼀种关联容器,提供⼀对⼀(C++ primer中⽂版中将第⼀个译为键,每个键只能在map中出现⼀次,第⼆个被译为该键对应的值)的数据处理能⼒,这种特性了使得map类似于数据结构⾥的红⿊⼆叉树。

C++STL中的vector的内存分配与释放

C++STL中的vector的内存分配与释放

C++STL中的vector的内存分配与释放1.vector的内存增长vector其中⼀个特点:内存空间只会增长,不会减⼩,援引C++ Primer:为了⽀持快速的随机访问,vector容器的元素以连续⽅式存放,每⼀个元素都紧挨着前⼀个元素存储。

设想⼀下,当vector添加⼀个元素时,为了满⾜连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。

因此STL实现者在对vector进⾏内存分配时,其实际分配的容量要⽐当前所需的空间多⼀些。

就是说,vector 容器预留了⼀些额外的存储区,⽤于存放新添加的元素,这样就不必为每个新元素重新分配整个容器的内存空间。

在调⽤push_back时,每次执⾏push_back操作,相当于底层的数组实现要重新分配⼤⼩;这种实现体现到vector实现就是每当push_back ⼀个元素,都要重新分配⼀个⼤⼀个元素的存储,然后将原来的元素拷贝到新的存储,之后在拷贝push_back的元素,最后要析构原有的vector并释放原有的内存。

例如下⾯程序:#include <iostream>#include <cstdlib>#include <vector>using namespace std;class Point{public:Point(){cout << "construction" << endl;}Point(const Point& p){cout << "copy construction" << endl;}~Point(){cout << "destruction" << endl;}};int main(){vector<Point> pointVec;Point a;Point b;pointVec.push_back(a);pointVec.push_back(b);cout<<pointVec.size()<<std::endl;return0;}输出结果:其中执⾏pointVec.push_back(a);此时vector会申请⼀个内存空间,并调⽤拷贝构造函数将a放到vector中再调⽤pointVec.push_back(b);此时内存不够需要扩⼤内存,重新分配内存这时再调⽤拷贝构造函数将a拷贝到新的内存,再将b拷⼊新的内存,同时有⼈调⽤Point拷贝构造函数,最后释放原来的内存此时调⽤Point的析构函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用静态数组初始化vector一维情况:int vv[2] = { 12,43 };std::vector<int> v(&vv[0], &vv[0]+2);Or, for the case of assignment to an existing vector:int vv[2] = { 12,43 };v.assign(&vv[0], &vv[0]+2);// the iterator constructor can also be used to construct from arrays: int myints[] = {16,2,77,29};vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );二维情况:int arr[4][8] ={{1, 2, 3, 4, 5, 6, 7, 8},{1, 2, 3, 4, 9, 10, 11, 12},{1, 2, 5, 6, 9, 10, 13, 14},{1, 3, 5, 7, 9, 11, 13, 15},};std::vector<std::vector<int> > vec(4, std::vector<int>(8));for (int i = 0; i < 4; ++i){vec[i].assign(arr[i], arr[i] + 8);}例子:float arrOfPos[][2] = { {501,10}, {501,128} };int nPosNum = sizeof(arrOfPos) / sizeof(float) / 2;vector< vector<float> > vecOfPos(nPosNum, vector<float>(2, 0));for (int i = 0; i < nPosNum; i++)vecOfPos[i].assign(arrOfPos[i], arrOfPos[i]+2);float arrOfNeg[][2] = { {255, 10}, {501, 255}, {10, 501} };int nNegNum = sizeof(arrOfNeg) / sizeof(float) / 2;vector< vector<float> > vecOfNeg(nNegNum, vector<float>(2, 0));for (int i = 0; i < nNegNum; i++)vecOfNeg[i].assign(arrOfNeg[i], arrOfNeg[i]+2);删除指定的元素:for(vector<int>::iterator iter=veci.begin(); iter!=veci.end();注意此处){if( *iter == 3)iter = veci.erase(iter); // An iterator that designates the first element remaining beyond any elements removed, or a pointer to the // end of the vector if no such element exists//在erase后,it失效,并不是指向vector的下一个元素,it成了一个“野指针”,返回的是指向下一个元素的迭代器elseiter ++ ;}vector中insert()的用法详解iterator insert( iterator loc, const TYPE &val );void insert( iterator loc, size_type num, const TYPE &val );void insert( iterator loc, input_iterator start, input_iterator end );insert() 函数有以下三种用法:在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,在指定位置loc前插入num个值为val的元素在指定位置loc前插入区间[start, end)的所有元素 .注意点:insert是插入到指定position的前面,而不是后部。

The vector is extended by inserting new elements before the element at the specified position, effectively increasing the container size by the number of elements inserted.This causes an automatic reallocation of the allocated storage space if -and only if- the new vector size surpasses the current vector capacity.在一个vector尾部append另一组数据:#include <vector>#include <iostream>using namespace std;int main() {vector<int> nums;for(int i = 1; i <= 10; ++i)nums.push_back(i);vector<int> appends;for(int i = -5; i <= -1; ++i)appends.push_back(i);nums.insert(nums.end(), appends.begin(), appends.end()) ;for(int i = 0; i < nums.size(); ++i)cout<<nums[i]<<' ';cout<<endl;return 0;}结果:Compiling the source code....$g++ -std=c++11 main.cpp -o demo -lm -pthread -lgmpxx -lgmp -lreadline 2>&1 Executing the program....$demo 1 2 3 4 5 6 7 8 9 10 -5 -4 -3 -2 -1在vector中循环插入长度相等的vector:vector<int> subnums;for(int i = 1; i <= 10; ++i)subnums.push_back(i);vector<int> nums(40, 0);nums.reserve(50);cout << "capacity" << nums.capacity() <<endl; // 50for(int i = 0; i < 4; i++) {nums.insert(nums.begin()+((i)*10), subnums.begin(), subnums.end()) ;for(int i = 0; i < nums.size(); ++i)cout<<nums[i]<<' ';cout<<endl;}Compiling the source code....$g++ -std=c++11 main.cpp -o demo -lm -pthread -lgmpxx -lgmp -lreadline 2>&1Executing the program....$demo1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0Insert会自动增加内存vector<int> nums;for(int i = 0; i < 4; i++) {nums.insert(nums.end(), subnums.begin(), subnums.end()) ;for(int i = 0; i < nums.size(); ++i)cout<<nums[i]<<' ';cout<<endl;subnums.push_back(11+i);}Compiling the source code....$g++ -std=c++11 main.cpp -o demo -lm -pthread -lgmpxx -lgmp -lreadline 2>&1Executing the program....$demo 1 2 3 4 5 6 7 8 9 101 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 111 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 11 1 2 3 4 5 6 7 8 9 10 11 121 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 11 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 13Vector内存:关于vector,简单地讲就是一个动态数组,里面有一个指针指向一片连续的内存空间,当空间不够装下数据时会自动申请另一片更大的空间,然后把原有数据拷贝过去,接着释放原来的那片空间;当释放或者说是删除里面的数据时,其存储空间并不会释放,仅仅只是清空了里面的数据。

相关文档
最新文档