STL:vectoer

部署运行你感兴趣的模型镜像

#首先包含头文件:

#include <vector>

using namespace std;//需要使用该命名空间

 

#然后定义对象:

vector<int> m_steps;

 

#向对象中添加数据:

m_steps.push_back(123);

vector.push_back的对象所属类一定是要实现了拷贝构造函数以及”=”运算符重载的

当将某些自定义类的对象push_back出错时,可以考虑vector中保存该类的指针

 

#然后可以像数组一样使用该对象的数据:

int a =m_steps[0];

 

#获取第一个元素,返回一个迭代器:(序列允许为空。若序列为空,则指向序列末端的下一个位置)

m_steps.begin();

 

#获取最后一个元素,返回的是引用,也就是最后一个元素的实际值:(序列不允许为空)

m_steps.back();

 

#获取最后一个元素的下一个位置,返回一个迭代器:(序列是否为空无影响)

m_steps.end();

 

#判断序列是否为空:

m_steps.empty();//若为空返回true,否则返回false

 

#vector中元素逆置:

#include<algorithm>

reverse ( m_steps.begin(),m_steps.end());

 

#去除vector中的重复元素:

#include<algorithm>

sort(m_steps.begin(),m_steps.end());//首先要调用默认排序

m_steps.erase(unique(m_steps.begin(),m_steps.end() ), m_steps.end());

 

#vector数组求和:

首先包含头文件:

#include < numeric>

int sum = std::accumulate(v.begin(), v.end(), 0); //求和

其函数原型为:

template< class InputIt, class >
T accumulate
( InputIt first, InputIt last, Tinit );

①  first:求和序列的第一个元素位置

②  last:求和序列的最后一个元素位置

③  init:和的初始值。对序列求和后,加上该值,即为所得结果

该求和函数可对任何重载了+=的数据类型调用,包括结构体和类,而不仅局限于基本数据类型。

该函数的内部实现为:使用一个for循环,让迭代器从第一个元素一直遍历到最后一个元素并叠加。效率并不比自己实现一个累加函数更高。

 

#定义static类型vector

static std::vector<std::vector<GLPoint>>      m_vPoints;

上面定义了一个二维的static类型vector。一维同理。

若要在类中定义static类型vector成员变量:

.h文件

static std::vector<std::vector<GLPoint>>      m_vPoints;

.cpp文件

std::vector<std::vector<GLPoint>>        className::m_vPoints;

这样会调用vector的默认构造函数以进行初始化。

 

#设置vector大小:

m_steps.resize(5);//vector设为5个元素大小

该函数只用于设置vector大小,设置的同时不会对已有元素进行清除。若vector中有10个元素,m_steps.resize(5)会只保留前5个元素;若vector中有3个元素,m_steps.resize(5)会将vector大小调整为5,其中前3个元素保留原值。

 

#vector定义二维数组:定义一个1011列的数组:

①  vector <vector<int>  >   array;//使用vector嵌套定义。注意两个”>”之间要有空格,否则会被认为是”>>”运算符

array.resize(10); //设置第一维大小

for(int  i=0;i<10;i++)
     array[i].resize(11); //设置第二维大小

②  vector定义二维数组还有另一种写法:

vector <int>  array[10];

用法跟上面相同,但是不需要对第二维进行resize不推荐使用该写法,该写法属于CC++混用的写法。

 

 

#vector作参数:

void Function(vector < int> &vecTest); //函数声明

vector< int > vec;  //定义vector

Function (vec);  //vector作参数来调用

 

#vector作返回值:

std::vector<double>GetStandLength();//函数声明

然后在函数内部定义一个std::vector<double>,最后返回该vector即可。

 

#vector指针

只要将vector <int >看作是类型即可。以下代码测试通过:

vector< int > vA; //定义vector

vector< int >* pvA; //定义vector指针

for (int i =0;i<7;i++)

{

         vA.push_back(i); //初始化vector

}

pvA = &vA; //vector指针赋值

for (int i=0;i<7;i++)

{

         cout<<(*pvA)[i]<<endl; //使用vector指针

}

cout<<( int)pvA->size();

注意vector指针指针vector是不同的。

vector指针:vector< int>* pvA;//指向vector的指针

指针vector:vector< int*> vpA;//存储指针的vector

 

#删除末尾的数据:

m_steps.pop_back();

 

#删除指定位置的数据:

m_steps.begin()为第一个元素,即相当于索引为0,也就是第0个元素。

若要删除索引为k的元素,也就是第k+1个元素,如下:(删除后后面所有的元素前移,返回值为下一个元素)

m_steps.erase(m_steps.begin()+k);

m_steps.erase(m_steps.begin());//删除第一个元素

 

#删除指定区间的数据:

如下,删除了索引为[m,n)区间的所有数据。注意m为闭区间n为开区间。也就是从第m+1个元素(包括自身)开始删除,一直删除到第n个元素。(n+1个元素不删除)

m_steps.erase(m_steps.begin()+m, m_steps.begin()+n);

注意:当m=n时,是不会做任何删除的。如:

m_steps.erase(m_steps.begin()+k, m_steps.begin()+k);//该操作不会做任何删除

 

#合并两个vector的数据,将一个vector中的数据添加到另一个同类型vector之后:即A=A+B=AB;

m_vectorA.insert(m_vectorA.end(),m_vectorB.begin(),m_vectorB.end());

注意insert的作用是将数据插入指定元素之前。

 

#vector的指定索引插入数据:

0号元素后面插入5个元素,其值都是10

也就是在1号元素前面插入5个元素,其值都是10

m_vectorA.insert(m_vectorA.begin()+1,5,10);

A后面插入5个元素,其值都是10

m_vectorA.insert(m_vectorA.end(),5,10);

 

#复制vector中的数据(一维,二维,多维)

可以直接使用 = 来复制vector中的数据,无论是几维的vector

//一维的情形

vector <int> array1;

为array1赋值;

vector <int> array2;

array2 = array1;//这样即可以将array1中的所有数据复制过来

 

//二维的情形

vector <vector<int>  >   array;

array.resize(5); //设置第一维大小

for(int i=0;i<5;i++)

                   array[i].resize(7);//设置第二维大小

//为二维数组挨个赋值

for (int i = 0;i<5;i++)

{

         for (int j=0;j<7;j++)

         {

                   array[i][j] = 0;

         }

}

 

vector <vector <int>  >   array2;

array2 = array;//这样就可以将array中所有的数据复制过来,不用对array2进行resize指派大小。之后array2的数据就是不依赖于array独立存在的。

 

 

#删除指定数据:

1.删除指定位置数据:

比如删除第4个元素:

m_steps.erase(m_steps.begin()+3);

注意erase()函数的参数是一个iterator,它没有一个参数为int的版本,所以不可以使用m_steps.erase(3)这样的格式,而必须指定一个iterator给它,就像上面的v.begin()+3就是指第4个元素。

2.删除指定值数据:

由于erase()函数的参数必须用iterator,故删除的时候需要得到指定数据所在的iterator

vector<int>::iterator begin = key.begin();//获取开始位置的iterator,注意vector后的数据类型要统一

for(size_t i = 0;i <key.size();)

{

         if (key[i] == 7)//若当前值等于指定值,则需要将当前数据删除

         {

                   key.erase(begin+i); //删除当前元素

         }

         else

         {

                   i++;

         }

}

注意for循环判断结束条件的写法以及i++的位置。因为删除数据后,vector的大小发生了变化,故而判断条件不能写成一个固定的大小。当删除一个数据后,后面的数据前移,此时i就不应该继续自增。

 

#获取vector中元素的个数(多少个,比下标多1)

size_t num = m_steps.size();

size_t的定义是:typedef unsigned int size_t

也就是说size_t类型相当于一个UINT,但是无论是将size_t赋值给int还是UINT,都会提示数据丢失

比较好的做法是直接使用size_t数据类型。size_t数据类型依然可以用来作为数组的下标。如:

size_t stepNum = m_steps.size();

                   for (size_t i = 0;i< stepNum;i++)

                   {

                            m_steps[i].YuDrawPicture(&dc);

                   }

 

#对二维数组进行旋转:

1.顺时针旋转90°

即:

1 2 3    7 4 1

4 5 6 –> 8 5 2

7 8 9    9 6 3

思路:首先复制一个二维数组2,从2中取一个元素,然后直接把该元素在数组1中旋转后的位置赋值即可。

设有名为array1的vector二维数组,该数组大小为n*n,该数组已经有数据。并定义名为array2的二维数组。

array2 = array1;//array1的数据复制到array2中保存

for (int i = 0;i<n;i++)

{

         for (int j=0;j<n;j++)

         {

             array1[j][n-i-1] =array2[i][j];

         }

}

这样array1中的数据就已经做了顺时针旋转90°的操作。

2.逆时针旋转90°

即:

1 2 3    3 6 9

4 5 6 –>   2 5 8

7 8 9    1 4 7

思路:首先复制一个二维数组2,从2中取一个元素,然后直接把该元素在数组1中旋转后的位置赋值即可。

设有名为array1的vector二维数组,该数组大小为n*n,该数组已经有数据。并定义名为array2的二维数组。

array2 = array1;//array1的数据复制到array2中保存

for (int i = 0;i<n;i++)

{

         for (int j=0;j<n;j++)

         {

             array1[n-j-1][i] =array2[i][j];

         }

}

这样array1中的数据就已经做了逆时针旋转90°的操作。

 

#交换两个vector

无论两个vector中的数据个数是否相同

vector1.swap(vector2);

 

#交换两个指定数据:

swap(m_steps[0], m_steps [7]);

 

#vector中的数据进行排序:

首先要声明一个排序规则函数,必须使用静态:

static bool cmp(const int& sp1,const int& sp2);

然后实现,注意书写格式:

bool CXXX::cmp(const int&sp1,const int& sp2)

{//升序排序:前者的值小于后者

         if (sp1<sp2)

         {

                   return true;

         }

         else

         {

                   return false;

         }

}

然后调用排序函数,函数的最后一个参数传进排序规则函数名:

sort(m_steps.begin(),m_steps.end(),CXXX::cmp);

注意sort()函数需要使用头文件#include <algorithm>

if的比较条件中,只能使用简单的比较运算,不可以使用<=或者>=

 

#最后在析构函数中清空vector对象:(即使使用了多维的vector,也只需要调用一个clear清空最外层的数组即可,其他内层的数组无论有多少层,会全部都被清除)

ConvexShell::~ConvexShell(void)

{

         m_steps.clear();

}

clear()删除储存在vector中的所有元素. 如果vector的元素是一些object,则它将为当前储存的每个元素调用它们各自的析构函数。然而, 如果vector储存的是指向对象的指针, 此函数并不会调用到对应的析构函数。在第二种情况下, 为了完全删除vector中的元素则应使用一个类似于下的循环:

for(int i=0 ;i<aVector.size() ; i++)

{

        deleteaVector[i];

}

         aVector.clear();

 

 

vector中的数据是连续存储的。若vector中的存储空间不足以存储接下来要存入的元素,那么vector会申请一片足够大的内存,将自身已存储的元素复制过去,然后再接收将要存入的元素。所以新元素存入后,vector中的数据依然是连续的。

获取vector中数据区首地址的方法是:&aVector[0];

如:

int*pInt   =       &vNum[0];

或:

int*pInt   =       new int[100];

memcpy(pInt,&vNum[0],sizeof(int)*100);

都是正确的。

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值