vector的c++用法
- 格式:pdf
- 大小:132.87 KB
- 文档页数:7
c++中vector的用法详解vector(向量): C++中的一种数据结构,确切的讲是一个类.它相当于一个动态的数组,当程序员无法明白自己需要的数组的规模多大时,用其来解决咨询题能够达到最大节约空间的目的.用法:1.文件包含:首先在程序开头处加上#include以包含所需要的类文件vector还有一定要加上using namespace std;2.变量声明:2.1 例:声明一个int向量以替代一维的数组:vector a;(等于声明了一个int数组a[],大小没有指定,能够动态的向里面添加删除)。
2.2 例:用vector代替二维数组.事实上只要声明一个一维数组向量即可,而一个数组的名字事实上代表的是它的首地址,因此只要声明一个地址的向量即可,即:vector a.同理想用向量代替三维数组也是一样,vector a;再往上面依此类推.3.具体的用法以及函数调用:3.1 如何得到向量中的元素?其用法和数组一样:例如:vector aint b = 5;a.push_back(b);//该函数下面有详解cout c.c.clear()移除容器中所有数据。
c.empty()推断容器是否为空。
c.erase(pos)删除pos位置的数据c.erase(beg,end)删除[beg,end)区间的数据c.front()传回第一个数据。
c.insert(pos,elem)在pos位置插入一个elem拷贝c.pop_back()删除最后一个数据。
c.push_back(elem)在尾部加入一个数据。
c.resize(num)重新设置该容器的大小c.size()回容器中实际数据的个数。
c.begin()返回指向容器第一个元素的迭代器c.end()返回指向容器最后一个元素的迭代器4.内存治理与效率1》使用reserve()函数提早设定容量大小,幸免多次容量扩充操作导致效率低下。
关于STL容器,最令人赞扬的特性之一就是是只要不超过它们的最大大小,它们就能够自动增长到足以容纳你放到里面去的数据。
c中vector的用法推荐文章一个有性格的智能友好机器人——Vector 热度: vector和list的区别是什么热度:如何将jpg转换成cad 热度:c中vector的用法的用法你知道吗?下面小编就跟你们详细介绍下c中vector的用法的用法,希望对你们有用。
c中vector的用法的用法如下:1 基本操作(1)头文件#include<vector>.(2)创建vector对象,vector<int> vec;(3)尾部插入数字:vec.push_back(a);(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.vector<int>::iterator it;for(it=vec.begin();it!=vec.end();it++)cout<<*it<<endl;(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始(8)向量大小:vec.size();(9)清空:vec.clear();2vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。
下面是一段简短的程序代码:复制代码#include<stdio.h>#include<algorithm>#include<vector>#include<iostream>using namespace std;typedef struct rect{int id;int length;int width;//对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。
C++中vector使⽤详细说明(转)转⾃:⼀、向量的介绍向量 vector 是⼀种对象实体, 能够容纳许多其他类型相同的元素, 因此⼜被称为容器。
与string相同, vector 同属于STL(Standard Template Library, 标准模板库)中的⼀种⾃定义的数据类型, 可以⼴义上认为是数组的增强版。
在使⽤它时, 需要包含头⽂件 vector, #include<vector>vector 容器与数组相⽐其优点在于它能够根据需要随时⾃动调整⾃⾝的⼤⼩以便容下所要放⼊的元素。
此外, vector 也提供了许多的⽅法来对⾃⾝进⾏操作。
⼆、向量的声明及初始化vector 型变量的声明以及初始化的形式也有许多, 常⽤的有以下⼏种形式:vector<int> a ; //声明⼀个int型向量avector<int> a(10) ; //声明⼀个初始⼤⼩为10的向量vector<int> a(10, 1) ; //声明⼀个初始⼤⼩为10且初始值都为1的向量vector<int> b(a) ; //声明并⽤向量a初始化向量bvector<int> b(a.begin(), a.begin()+3) ; //将a向量中从第0个到第2个(共3个)作为向量b的初始值除此之外, 还可以直接使⽤数组来初始化向量:int n[] = {1, 2, 3, 4, 5} ;vector<int> a(n, n+5) ; //将数组n的前5个元素作为向量a的初值vector<int> a(&n[1], &n[4]) ; //将n[1] - n[4]范围内的元素作为向量a的初值三、元素的输⼊及访问元素的输⼊和访问可以像操作普通的数组那样, ⽤cin>>进⾏输⼊, cout<<a[n]这样进⾏输出:⽰例:1 #include<iostream>2 #include<vector>34 using namespace std ;56 int main()7 {8 vector<int> a(10, 0) ; //⼤⼩为10初值为0的向量a910 //对其中部分元素进⾏输⼊11 cin >>a[2] ;12 cin >>a[5] ;13 cin >>a[6] ;1415 //全部输出16 int i ;17 for(i=0; i<a.size(); i++)18 cout<<a[i]<<" " ;1920 return 0 ;21 }在元素的输出上, 还可以使⽤遍历器(⼜称迭代器)进⾏输出控制。
c在r语言中的意思在R语言中,`c()`是一个函数,用于创建向量(vector)。
`c()`的意思是“concatenate”(连接),它可以将多个元素合并成一个向量。
`c()`函数可以接受任意数量的参数,参数可以是数字、字符、逻辑值或其他R对象。
例如:```R# 创建一个包含数字的向量numbers <- c(1, 2, 3, 4, 5)# 创建一个包含字符的向量characters <- c("a", "b", "c", "d", "e")# 创建一个包含逻辑值的向量logicals <- c(TRUE, FALSE, TRUE, TRUE, FALSE)# 创建一个包含不同类型的对象的向量mixed <- c(1, "a", TRUE, 3.14, FALSE)````c()`函数还可以用于将多个向量连接起来。
当连接多个向量时,它会按照参数的顺序进行连接。
例如:```R# 连接两个向量vec1 <- c(1, 2, 3)vec2 <- c(4, 5, 6)result <- c(vec1, vec2)# 结果为: 1, 2, 3, 4, 5, 6```除了用于创建向量,`c()`函数还可以用于创建矩阵、数据框或列表等数据结构。
例如:```R# 创建矩阵matrix <- cbind(c(1, 2, 3), c(4, 5, 6))# 创建数据框dataframe <- data.frame(name = c("John", "Jane", "Alice"),age = c(25, 30, 35),gender = c("Male", "Female", "Female"))# 创建列表list <- list(c(1, 2, 3), c("a", "b", "c"), c(TRUE, FALSE, TRUE))````c()`函数在R语言中用于创建向量,以及连接多个向量、创建矩阵、数据框或列表等数据结构。
c++遍历vector的四种⽅式可以使⽤迭代器,可以使⽤auto,可以使⽤for_each,可以使⽤下标。
#include <vector>vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);//(1)迭代器遍历⽅式1vector<int>::iterator start = v1.begin();//指向容器的初始位置vector<int>::iterator end = v1.end();//指向元素最后⼀个位置的后⼀个位置while(start != end){cout << *start << endl;start++;}//(2)迭代器遍历⽅式2//可以把这⾥的vector<int>::iterator改成auto,会⾃动推测//for(auto start = v1.begin(); start != v1.end(); start++)for(vector<int>::iterator start = v1.begin(); start != v1.end(); start++){cout << *start << endl;}//(3)使⽤for_each内置算法进⾏遍历,配合lambda匿名函数//需要包含头⽂件#include <algorithm>for_each(v1.begin(), v1.end(), [](int val)->void { cout << val << endl;});//(4)使⽤for_each加函数template<typename T>void printer(const T& val){cout << val << endl;}for_each(v1.cbegin(), v1.cend(), printer<int>);//(5)使⽤for_each加仿函数template<typename T>struch functor{void operator()(const T& obj){cout << obj << endl;}};for_each(v1.cbegin(), v1.cend(), functor<int>());//(6)数组下标⽅式1int count_1 = v1.size();for(int i = 0; i < count_1; i++){cout << v1[i] << endl;}//(7)数组下标⽅式2int count_2 = v1.size();for(int i = 0; i < count_2; i++){cout << v1.at(i) << endl; }//(8)for区间遍历for(auto val: v1){cout << val << endl;}。
c vector用法摘要:1.C++中的容器2.C vector 的定义与初始化3.C vector 的基本操作4.C vector 的常用功能5.C vector 的注意事项正文:C++是一种功能强大的编程语言,它提供了丰富的数据结构和算法,以满足各种编程需求。
在C++中,容器是一种重要的数据结构,它可以存储和管理数据。
今天我们将介绍C++中的一种常用容器——C vector。
C vector,中文名为C 向量,是C++标准库中的一个容器,用于存储同一类型的数据元素。
C vector 可以在程序运行过程中动态地调整其大小,因此它非常适合存储动态数据。
一、C vector 的定义与初始化要使用C vector,首先需要包含相应的头文件<vector>。
然后,可以使用以下方式定义一个C vector:```vector<数据类型> 变量名(容量);```其中,数据类型可以是int、float、double 等任意类型,容量表示C vector 的初始大小。
例如,定义一个存储整数的C vector:```vector<int> nums(10);```定义之后,C vector 会自动分配内存,并将所有元素初始化为0 或0.0。
二、C vector 的基本操作C vector 提供了许多基本操作,包括访问、修改、添加和删除元素等。
以下是一些常用的操作:1.访问元素:使用下标操作符[],如下:```int num = nums[i];```2.修改元素:使用赋值操作符=,如下:```ums[i] = num;```3.添加元素:使用insert() 函数,如下:```ums.insert(nums.begin(), num);```4.删除元素:使用erase() 函数,如下:```ums.erase(nums.begin());```三、C vector 的常用功能C vector 还提供了许多有用的功能,包括遍历、排序、查找等。
std::vector是C++标准库中的一个动态数组模板类,它提供了灵活的内存管理功能,可以根据需要自动增长和缩小。
以下是std::vector的一些基本用法:1. 创建和初始化:默认初始化:vector<int> vec; 默认初始化创建一个空的vector。
指定大小和初始值:vector<int>vec(10, 0); 创建一个包含10个元素的vector,所有元素初始化为0。
拷贝初始化:vector<int> vec2 = vec1; 将vec1的内容拷贝到vec2中。
列表初始化:vector<int> vec = {1, 2, 3, 4, 5}; 将列表中的元素拷贝到vec中。
2. 向vector中添加元素:push_back()函数:向vector末尾添加一个元素。
insert()函数:在指定位置插入一个或多个元素。
emplace()函数:在指定位置构造并插入一个元素。
3. 访问vector中的元素:通过下标运算符[]访问指定位置的元素。
使用at()函数访问指定位置的元素,该函数会进行越界检查。
4. 修改vector中的元素:可以直接通过下标运算符[]或at()函数修改指定位置的元素值。
5. 删除vector中的元素:pop_back()函数:删除vector末尾的元素。
erase()函数:删除指定位置的元素或删除一个范围内的元素。
6. 获取vector的长度和容量:size()函数:返回vector中的元素个数。
capacity()函数:返回vector当前容量的大小。
7. 清空vector:clear()函数:清空vector中的所有元素,使其变为空vector。
8. 其他常用操作:push_front()函数:向vector开头添加一个元素(C++11引入)。
insert()函数:在指定位置插入一个或多个元素(C++11引入)。
erase()函数:删除指定位置的元素或删除一个范围内的元素(C++11引入)。
动态创建⼆维vector数组C和C++及指针与引⽤的区别⼆维vectorvector<vector <int> > ivec(m ,vector<int>(n)); //m*n的⼆维vector动态创建m*n的⼆维vector⽅法⼀:vector<vector <int> > ivec;ivec.resize(m);for(int i=0;i<m;i++) ivec[i].resize(n);⽅法⼆:vector<vector <int> > ivec;ivec.resize(m,vector<int>(n));动态创建⼆维数组a[m][n]C语⾔版:#include<malloc.h>int **a=(int **)malloc(m*sizeof(int *));for(int i=0;i<m;i++)a[i]=(int *)malloc(n*sizeof(int));C++版:int **a=new int*[m];for(int i=0;i<m;i++) a[i]=new int[n];初始化⼆维数组vector<vector <int> > ivec(m ,vector<int>(n,0)); //m*n的⼆维vector,所有元素为0C++中⽤new动态创建⼆维数组的格式⼀般是这样:TYPE (*p)[N] = new TYPE [][N];其中,TYPE是某种类型,N是⼆维数组的列数。
采⽤这种格式,列数必须指出,⽽⾏数⽆需指定。
在这⾥,p的类型是TYPE*[N],即是指向⼀个有N列元素数组的指针。
还有⼀种⽅法,可以不指定数组的列数:int **p;p = new int*[10]; //注意,int*[10]表⽰⼀个有10个元素的指针数组for (int i = 0; i != 10; ++i){p[i] = new int[5];}这⾥是将p作为⼀个指向指针的指针,它指向⼀个包含10个元素的指针数组,并且每个元素指向⼀个有5个元素的数组,这样就构建了⼀个10⾏5列的数组。
linux c vector用法Linux C Vector用法在C语言中,向量(Vector)是一种动态数组,也称为可变长度数组或者可变数组。
它允许以类似于数组的方式存储多个元素,并且能够在运行时根据需要动态调整大小。
在Linux环境下,Vector是一种常用的数据结构,它提供了一些方便的函数和操作,使得向量的使用更加简单和高效。
在本文中,我们将详细介绍Linux C中向量的用法,包括向量的创建和初始化、向量的增加和删除元素、向量的遍历和访问元素等。
1. 向量的创建和初始化在使用向量之前,我们需要先创建一个向量变量,并对其进行初始化。
在Linux C环境中,我们可以使用下列代码来创建一个向量,并对其赋初值:#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#include <stdint.h>#include <stdbool.h>#include <vector.h>int main() {vector_t* vec = vector_init(10, sizeof(int));if (vec == NULL) {printf("Vector initialization failed.\n");return -1;}...return 0;}在上述代码中,我们首先包含了必要的头文件,包括`stdio.h`, `stdlib.h`, `stdarg.h`, `stdint.h`, `stdbool.h` 以及`vector.h`。
然后,我们使用`vector_init` 函数创建了一个向量`vec`,并指定了向量的初始大小为10,并且向量中的元素类型为整数类型(`sizeof(int)` )。
最后,我们检查向量是否创建成功,若创建失败,则打印错误信息并返回-1,否则继续执行后续逻辑。
c++ vector用法C++内置的数组支持容器的机制,但是它不支持容器抽象的语义。
要解决此问题我们自己实现这样的类。
在标准C++中,用容器向量(vector)实现。
容器向量也是一个类模板。
标准库vector类型使用需要的头文件:#include <vector>。
vector 是一个类模板。
不是一种数据类型,vector<int>是一种数据类型。
Vector的存储空间是连续的,list不是连续存储的。
一、定义和初始化vector< typeName > v1; //默认v1为空,故下面的赋值是错误的v1[0]=5; vector<typeName>v2(v1); 或v2=v1;或vector<typeName> v2(v1.begin(), v1.end());//v2是v1的一个副本,若v1.size()>v2.size()则赋值后v2.size()被扩充为v1.size()。
vector< typeName > v3(n,i);//v3包含n个值为i的typeName类型元素vector< typeName > v4(n); //v4含有n个值为0的元素int a[4]={0,1,2,3,3}; vector<int> v5(a,a+5);//v5的size为5,v5被初始化为a的5个值。
后一个指针要指向将被拷贝的末元素的下一位置。
vector<int> v6(v5);//v6是v5的拷贝vector< 类型> 标识符(最大容量,初始所有值);二、值初始化1> 如果没有指定元素初始化式,标准库自行提供一个初始化值进行值初始化。
2> 如果保存的式含有构造函数的类类型的元素,标准库使用该类型的构造函数初始化。
3> 如果保存的式没有构造函数的类类型的元素,标准库产生一个带初始值的对象,使用这个对象进行值初始化。
三、vector对象最重要的几种操作1. v.push_back(t)在容器的最后添加一个值为t的数据,容器的size变大。
另外list有push_front()函数,在前端插入,后面的元素下标依次增大。
2. v.size()返回容器中数据的个数,size返回相应vector类定义的size_type 的值。
v.resize(2*v.size)或v.resize(2*v.size, 99)将v的容量翻倍(并把新元素的值初始化为99)3. v.empty()判断vector是否为空4. v[n]返回v中位置为n的元素5. v.insert(pointer,number, content) 向v中pointer指向的位置插入number 个content的内容。
还有v. insert(pointer, content),v.insert(pointer,a[2],a[4])将a[2]到a[4]三个元素插入。
6. v.pop_back()删除容器的末元素,并不返回该元素。
7.v.erase(pointer1,pointer2)删除pointer1到pointer2中间(包括pointer1所指)的元素。
vector中删除一个元素后,此位置以后的元素都需要往前移动一个位置,虽然当前迭代器位置没有自动加1,但是由于后续元素的顺次前移,也就相当于迭代器的自动指向下一个位置一样。
8. v1==v2 判断v1与v2是否相等。
9. !=、<、<=、>、>= 保持这些操作符惯有含义。
10. vector<typeName>::iterator p=v1.begin( ); p初始值指向v1的第一个元素。
*p取所指向元素的值。
对于const vector<typeName>只能用vector<typeName>::const_iterator类型的指针访问。
11. p=v1.end( ); p指向v1的最后一个元素的下一位置。
12.v.clear()删除容器中的所有元素。
12.v.clear() 删除容器中的所有元素。
#include<algorithm>中的泛函算法搜索算法:find() 、search() 、count() 、find_if() 、search_if() 、count_if()分类排序:sort() 、merge()删除算法:unique() 、remove()生成和变异:generate() 、fill() 、transformation() 、copy()关系算法:equal() 、min() 、max()sort(v1.begin(),vi.begin()+v1.size/2); 对v1的前半段元素排序list<char>::iterator pMiddle =find(cList.begin(),cList.end(),'A');找到则返回被查内容第一次出现处指针,否则返回end()。
vector< typeName >::size_type x ; vector< typeName >类型的计数,可用于循环如同for(int i)初学C++的程序员可能会认为vector的下标操作可以添加元素,其实不然:vector<int> ivec; // empty vectorfor (vector<int>::size_type ix = 0; ix != 10; ++ix)ivec[ix] = ix; // disaster: ivec has no elements上述程序试图在ivec中插入10个新元素,元素值依次为0到9的整数。
但是,这里ivec是空的vector对象,而且下标只能用于获取已存在的元素。
这个循环的正确写法应该是:for (vector<int>::size_type ix = 0; ix != 10; ++ix)ivec.push_back(ix); // ok: adds new element with value ix警告:必须是已存在的元素才能用下标操作符进行索引。
通过下标操作进行赋值时,不会添加任何元素。
仅能对确知已存在的元素进行下标操作四、内存管理与效率1.使用reserve()函数提前设定容量大小,避免多次容量扩充操作导致效率低下。
关于STL容器,最令人称赞的特性之一就是是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。
(要知道这个最大值,只要调用名叫max_size的成员函数。
)对于vector和string,如果需要更多空间,就以类似realloc的思想来增长大小。
vector容器支持随机访问,因此为了提高效率,它内部使用动态数组的方式实现的。
在通过reserve() 来申请特定大小的时候总是按指数边界来增大其内部缓冲区。
当进行insert或push_back等增加元素的操作时,如果此时动态数组的内存不够用,就要动态的重新分配当前大小的1.5~2倍的新内存区,再把原数组的内容复制过去。
所以,在一般情况下,其访问速度同一般数组,只有在重新分配发生时,其性能才会下降。
正如上面的代码告诉你的那样。
而进行pop_back操作时,capacity并不会因为vector容器里的元素减少而有所下降,还会维持操作之前的大小。
对于vector容器来说,如果有大量的数据需要进行push_back,应当使用reserve()函数提前设定其容量大小,否则会出现许多次容量扩充操作,导致效率低下。
reserve成员函数允许你最小化必须进行的重新分配的次数,因而可以避免真分配的开销和迭代器/指针/引用失效。
但在我解释reserve为什么可以那么做之前,让我简要介绍有时候令人困惑的四个相关成员函数。
在标准容器中,只有vector和string提供了所有这些函数。
(1) size()告诉你容器中有多少元素。
它没有告诉你容器为它容纳的元素分配了多少内存。
(2) capacity()告诉你容器在它已经分配的内存中可以容纳多少元素。
那是容器在那块内存中总共可以容纳多少元素,而不是还可以容纳多少元素。
如果你想知道一个vector或string中有多少没有被占用的内存,你必须从capacity()中减去size()。
如果size和capacity返回同样的值,容器中就没有剩余空间了,而下一次插入(通过insert或push_back等)会引发上面的重新分配步骤。
(3) resize(Container::size_type n)强制把容器改为容纳n个元素。
调用resize之后,size将会返回n。
如果n小于当前大小,容器尾部的元素会被销毁。
如果n 大于当前大小,新默认构造的元素会添加到容器尾部。
如果n大于当前容量,在元素加入之前会发生重新分配。
(4) reserve(Container::size_type n)强制容器把它的容量改为至少n,提供的n 不小于当前大小。
这一般强迫进行一次重新分配,因为容量需要增加。
(如果n 小于当前容量,vector忽略它,这个调用什么都不做,string可能把它的容量减少为size()和n中大的数,但string的大小没有改变。
在我的经验中,使用reserve 来从一个string中修整多余容量一般不如使用“交换技巧”,那是条款17的主题。
)这个简介表示了只要有元素需要插入而且容器的容量不足时就会发生重新分配(包括它们维护的原始内存分配和回收,对象的拷贝和析构和迭代器、指针和引用的失效)。
所以,避免重新分配的关键是使用reserve尽快把容器的容量设置为足够大,最好在容器被构造之后立刻进行。
例如,假定你想建立一个容纳1-1000值的vector<int>。
没有使用reserve,你可以像这样来做:vector<int> v;for (int i = 1; i <= 1000; ++i) v.push_back(i);在大多数STL实现中,这段代码在循环过程中将会导致2到10次重新分配。
(10这个数没什么奇怪的。
记住vector在重新分配发生时一般把容量翻倍,而1000约等于210。
)把代码改为使用reserve,我们得到这个:vector<int> v;v.reserve(1000);for (int i = 1; i <= 1000; ++i) v.push_back(i);这在循环中不会发生重新分配。
在大小和容量之间的关系让我们可以预言什么时候插入将引起vector或string 执行重新分配,而且,可以预言什么时候插入会使指向容器中的迭代器、指针和引用失效。