#首先包含头文件:
#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 >
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定义二维数组:定义一个10行11列的数组:
① 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。不推荐使用该写法,该写法属于C与C++混用的写法。
#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);
都是正确的。

838

被折叠的 条评论
为什么被折叠?



