vector总结(一维)会更新


近期会对容器大致进行一下总结,会持续更新

本博客参考引用 传送门 不用作商业目的,只是便于自己学习,如侵权联系可删
供学习传送门还没怎么看,不明觉厉,就先放在这儿了

一.vector

  • 适用于对象简单,变化较小,并且频繁随机访问的场景。

1.vector简介

在 c++ 中,vector 是一个十分有用的容器。它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
Vector类 是在 java 中可以实现自动增长的对象数组,vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库
vector(向量): 是一种序列式容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而 vector 正好弥补了这个缺陷,当内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。

2.vector特性

1.顺序序列
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
2.动态数组
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
3.能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求

特点:

  • 拥有一段连续的内存空间,因此它能非常好的支持随机访问,即 [] 操作符和 .at(),随机访问快。(优点)
  • 当向其头部或中间插入或删除元素时,为了保持原本的相对次序,插入或删除点之后的所有元素都必须移动,所以插入或删除的效率比较低。(缺点)
  • 在后面插入删除元素最快,此时一般不需要移动内存。(优点)
  • 总结:相当于可拓展的数组(动态数组),随机访问快,在头部和中间插入或删除效率低,但在尾部插入或删除效率高。

3.基本函数实现

使用前添加函数头#include<vector>

(1).构造函数

  • vector():创建一个空vector
vector<int> v;创建int型数据,容器名称为v
  • vector(int size):创建一个vector,元素个数为size
vector<int> v(2);创建长度为2int型的容器
  • vector(int size,const t& t):创建一个vector,元素个数为size,且值均为t
vector<int> v(5,0);创建一个长度为5,所有的初始值为0的容器
  • vector(const vector&t):复制构造函数
vector<int> v;
vector <int >v1(v);将v容器的复制到v1容器
  • vector(a.begin,a.end):复制a向量[begin,end]区间内另一个数组的元素到vector中
//将向量b中从0-2(共三个)的元素赋值给a,a的类型为int型
vector<int>a(b.begin(),b.begin+3);

(2).添加函数

  • void push_back(const T& x)​:向量尾部增加一个元素X
vector<int>test;//建立一个vector
test.push_back(1);
test.push_back(2);//把1和2压入vector这样test[0]就是1,test[1]就是2

我们可以用一个迭代器:
vector::iterator iter=test.begin();//定义一个可以迭代int型vector的迭代器iter,它指向test的首位
for(;iter!=test.end();iter++) cout<<(*iter);//iter++指的是向后迭代一位,直到iter到超出末端迭代器为止,输出迭代器指向的值
我们也可以使用at访问:

vector<int>test;//建立一个vector
test.push_back(1);
test.push_back(2);//把1和2压入vector这样test[0]就是1,test[1]就是2
int i =test.at(1);//i为2

vector添加数据的缺省方法是push_back()。push_back()函数表示将数据添加到vector的尾部,并按需要来分配内存。例如:向vector;中添加10个数据,需要如下编写代码:

for(int i= 0;i<10; i++) 
{
vWidgets.push_back(Widget(i));
}
  • iterator insert(iterator it,const T& x)​:向量中迭代器指向元素前增加一个元素x

首先要说明,在遍历的时候是绝对不能插入的,不然会导致迭代器的混乱,只能在静态情况下插入

  • ​iterator insert(iterator it,int n,const T& x)​:向量中迭代器指向元素前增加n个相同的元素x
    ​* iterator insert(iterator it,const_iterator first,const_iterator last)​:向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

(3).删除函数

  • iterator erase(iterator it)​:删除向量中迭代器指向元素,然后指向下一个数据的位置
  • iterator erase(iterator first,iterator last)​:删除向量中[first,last)中元素,传回下一个数据的位置
  • void pop_back()​:删除向量中最后一个元素
  • void clear()​:清空向量中所有元素
  • c.~ vector <Elem>()//销毁所有数据,释放内存
v.clear();

(4).遍历函数

  • reference at(int pos)​:返回pos位置元素的引用
v.at(int pos);
  • reference front()​:返回首元素的引用
v.front();
  • reference back()​:返回尾元素的引用
v.back();
  • iterator begin()​:返回向量头指针,指向第一个元素
v.begin();
  • ​iterator end()​:返回向量尾指针,指向向量最后一个元素的下一个位置
v.end();
  • reverse_iterator rbegin()​:反向迭代器,指向最后一个元素,逆序后,指向最后一个,也就是一开始的第一个元素
v.rbegin();
  • reverse_iterator rend()​:反向迭代器,指向第一个元素之前的位置,同上
v.rend();

(5).判断函数

  • bool empty() const​:判断向量是否为空,若为空,则向量中无元素
    *vector里面的数据是动态分配的,使用push_back()的一系列分配空间常常决定于文件或一些数据源。如果想知道vector是否为空,可以使用empty(),空返回true,否则返回false。获取vector的大小,可以使用size()。例如,如果想获取一个vector v的大小,但不知道它是否为空,或者已经包含了数据,如果为空时想设置为 -1,你可以使用下面的代码实现:
int nSize = v.empty() ? -1 : static_cast<int>(v.size());

(6).大小函数

  • int size() const​:返回向量中元素的个数
  • int capacity() const​:返回当前向量所能容纳的最大元素值
  • ​int max_size() const​:返回最大可允许的 vector 元素数量值

(7).其他函数

  • void swap(vector&)​:交换两个同类型向量的数据
  • int at(i):返回位置i的元素
  • void assign(int n,const T& x) ​:设置向量中前n个元素的值为x
vector<int >v;
    v.assign(5,1);
    while(v.size())
    {
        cout<<v.back()<<" "<<;
        v.pop_back();
    }
输出:1 1 1 1 1

​* void assign(const_iterator first,const_iterator last)​:向量中[first,last)中元素设置成当前向量元素,剩余元素没了? 一般用来进行部分拷贝或者转移较为好用

 vector<int >v(5,2),v1(5,1);
    v.assign(v1.begin(),v1.begin()+2);
    while(v.size())
    {
        cout<<v.back()<<' ';
        v.pop_back();
    }
输出:1 1
  • c.capacity()返回容能够容纳的元素数量
vector<int>v(6);
    int c=v.capacity();
    cout<<c<<endl;
输出:6
  • get_allocator
    使用构造函数返回一个拷贝。
    c.insert(c.begin()+pos,elem)//在pos位置插入一个elem拷贝,传回新数据位置
    c.insert(c.begin()+pos,n,elem)//在pos位置插入n个elem数据,无返回值
    c.insert(c.begin()+pos,beg,end)//在pos位置插入在[beg,end)区间的数据。无返回值
  • c.max_size()返回容器中最大可以储存的数据
  • c.resize(num)改变数组大小,如果x比之前分配的空间大,则自动填充默认值
  • c.reserve()保留适当的容量。reserve为容器预留足够的空间,避免不必要的重复分配,分配空间大于等于函数的参数,影响capacity。
  • operator[]返回容器中指定位置的一个引用。
  • 访问vector中的数据
    使用两种方法来访问vector。
1、 vector::at()
2、 vector::operator[]

operator[]主要是为了与C语言进行兼容。它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。由于operator[]容易造成一些错误,所以我们很少用它.

  • remove()算法 如果要使用remove,需要在头文件中包含如下代码:#include <algorithm>

remove有三个参数:
1、 iterator _First:指向第一个数据的迭代指针。
2、 iterator_Last:指向最后一个数据的迭代指针。
3、 predicate _Pred:一个可以对迭代操作的条件函数。

  • 条件函数
    条件函数是一个按照用户定义的条件返回是或否的结果,是最基本的函数指针,或是一个函数对象。这个函数对象需要支持所有的函数调用操作,重载operator()()操作。remove是通过unary_function继承下来的,允许传递数据作为条件。
    例如,假如想从一个vector;中删除匹配的数据,如果字串中包含了一个值,从这个值开始,从这个值结束。首先应该建立一个数据结构来包含这些数据,类似代码如下:
#include <functional>
enum findmodes {
FM_INVALID = 0,
FM_IS,
FM_STARTSWITH,
FM_ENDSWITH,
FM_CONTAINS
};
typedef struct tagFindStr {
UINT iMode;
CString szMatchStr;
} FindStr;
typedef FindStr* LPFINDSTR;
然后处理条件判断:
class FindMatchingString : public std::unary_function<CString,bool> {
public:
FindMatchingString(const LPFINDSTR lpFS) :
m_lpFS(lpFS) {
}
bool operator()(CString& szStringToCompare) const {
bool retVal = false;
switch (m_lpFS->iMode) {
case FM_IS: {
retVal = (szStringToCompare == m_lpFDD->szMatchStr);
break;
}
case FM_STARTSWITH: {
retVal = (szStringToCompare.Left(m_lpFDD->szMatchStr.GetLength())
== m_lpFDD->szWindowTitle);
break;
}
case FM_ENDSWITH: {
retVal = (szStringToCompare.Right(m_lpFDD->szMatchStr.GetLength())
== m_lpFDD->szMatchStr);
break;
}
case FM_CONTAINS: {
retVal = (szStringToCompare.Find(m_lpFDD->szMatchStr) != -1);
break;
}
}
return retVal;
}
private:
LPFINDSTR m_lpFS;
};

通过这个操作你可以从vector中有效地删除数据:
FindStr fs;
fs.iMode = FM_CONTAINS;
fs.szMatchStr = szRemove;
vs.erase(std::remove_if(vs.begin(),vs.end(),FindMatchingString(&fs)),vs.end());
Remove(),remove等所有的移出操作都是建立在一个迭代范围上的,不能操作容器中的数据。所以在使用remove,实际上操作的时容器里数据的上面的。
看到remove实际上是根据条件对迭代地址进行了修改,在数据的后面存在一些残余的数据,那些需要删除的数据。剩下的数据的位置可能不是原来的数据,但他们是不知道的。
调用erase()来删除那些残余的数据。注意上面例子中通过erase()删除remove的结果和vs.enc()范围的数据。
常见错误:
no matching function for call to ‘std::vector,一般由定义的类型与存入的类型不匹配引起。

(8).总结

  • 1.push_back 在数组的最后添加一个数据
  • 2.pop_back 去掉数组的最后一个数据
  • 3.at 得到编号位置的数据
  • 4.begin 得到数组头的指针
  • 5.end 得到数组的最后一个单元+1的指针
  • 6.front 得到数组头的引用
  • 7.back 得到数组的最后一个单元的引用
  • 8.max_size 得到vector最大可以是多大
  • 9.capacity 当前vector分配的大小
  • 10.size 当前使用数据的大小
  • 11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
  • 12.reserve 改变当前vecotr所分配空间的大小
  • 13.erase 删除指针指向的数据项
  • 14.clear 清空当前的vector
  • 15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
  • 16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
  • 17.empty 判断vector是否为空
  • 18.swap 与另一个vector交换数据
    举例:
#include<vector>
vector<int> a,b;
//b为向量,将b的0-2个元素赋值给向量a
a.assign(b.begin(),b.begin()+3);
//a含有4个值为2的元素
a.assign(4,2);
//返回a的最后一个元素
a.back();
//返回a的第一个元素
a.front();
//返回a的第i元素,当且仅当a存在
a[i];
//清空a中的元素
a.clear();
//判断a是否为空,空则返回true,非空则返回false
a.empty();
//删除a向量的最后一个元素
a.pop_back();
//删除a中第一个(从第0个算起)到第二个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)结束
a.erase(a.begin()+1,a.begin()+3);
//在a的最后一个向量后插入一个元素,其值为5
a.push_back(5);
//在a的第一个元素(从第0个算起)位置插入数值5,
a.insert(a.begin()+1,5);
//在a的第一个元素(从第0个算起)位置插入3个数,其值都为5
a.insert(a.begin()+1,3,5);
//b为数组,在a的第一个元素(从第0个元素算起)的位置插入b的第三个元素到第5个元素(不包括b+6)
a.insert(a.begin()+1,b+3,b+6);
//返回a中元素的个数
a.size();
//返回a在内存中总共可以容纳的元素个数
a.capacity();
//将a的现有元素个数调整至10个,多则删,少则补,其值随机
a.resize(10);
//将a的现有元素个数调整至10个,多则删,少则补,其值为2
a.resize(10,2);
//将a的容量扩充至100,
a.reserve(100);
//b为向量,将a中的元素和b中的元素整体交换
a.swap(b);
//b为向量,向量的比较操作还有 != >= > <= <
a==b;

4.基本用法

#include < vector> 
using namespace std;

顺序访问vector的几种方式,举例说明

  • 2.1. 对向量a添加元素的几种方式
    1.向向量a中添加元素
vector<int>a;
for(int i=0;i<10;++i){a.push_back(i);}

2.从数组中选择元素向向量中添加

int a[6]={1,2,3,4,5,6};
vector<int> b;
for(int i=0;i<=4;++i){b.push_back(a[i]);}

3.从现有向量中选择元素向向量中添加

int a[6]={1,2,3,4,5,6};
vector<int>b;
vector<int>c(a,a+4);
for(vector<int>::iterator it=c.begin();it<c.end();++it)
{
	b.push_back(*it);
}

4.从文件中读取元素向向量中添加

ifstream in("data.txt");
vector<int>a;
for(int i;in>>i){a.push_back(i);}

5.常见错误赋值方式

vector<int>a;
for(int i=0;i<10;++i){a[i]=i;}//下标只能用来获取已经存在的元素
  • 2.2 从向量中读取元素
    1.通过下标方式获取
int a[6]={1,2,3,4,5,6};
vector<int>b(a,a+4);
for(int i=0;i<=b.size()-1;++i){cout<<b[i]<<endl;}
  • 2.通过迭代器方式读取
 int a[6]={1,2,3,4,5,6};
 vector<int>b(a,a+4);
 for(vector<int>::iterator it=b.begin();it!=b.end();it++){cout<<*it<<"  ";}

5、简单介绍

  1. Vector<类型>标识符
  2. Vector<类型>标识符(最大容量)
  3. Vector<类型>标识符(最大容量,初始所有值)
  4. Int i[5]={1,2,3,4,5}Vector<类型>vi(I,i+2);//得到i索引值为3以后的值
  5. Vector< vector >v; 二维向量//这里最外的<>要有空格。否则在比较旧的编译器下无法通过

6、vector使用实例

使用vector注意事项:

(1)、如果你要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低;

(2)、Vector 作为函数的参数或者返回值时,需要注意它的写法:

double Distance(vector<int>&a, vector<int>&b)

其中的“&”绝对不能少!!!

二.vector对象的定义和初始化

同样的,使用前,导入头文件 #include 可以使用using声明:using std::vector;vector 是一个类模板(class template)。使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型。因此,我们可以定义保存 string 对象的 vector,或保存 int 值的 vector,又或是保存自定义的类类型对象(如 Sales_items 对象)的 vector。
声明从类模板产生的某种类型的对象,需要提供附加信息,信息的种类取决于模板。以 vector 为例,必须说明 vector 保存何种对象的类型,通过将类型放在类型放在类模板名称后面的尖括号中来指定类型:

结构含义
vector v1保存类型为 T 对象。默认构造函数 v1 为空
vector v2(v1)v2 是 v1 的一个副本
vector v3(n, i)v3 包含 n 个值为 i 的元素
vector v4(n)v4 含有值初始化的元素的 n 个副本

【注意:1、若要创建非空的 vector 对象,必须给出初始化元素的值;2、当把一个 vector 对象复制到另一个 vector
对象时,新复制的 vector 中每一个元素都初始化为原 vectors 中相应元素的副本。但这两个 vector
对象必须保存同一种元素类型;3、可以用元素个数和元素值对 vector 对象进行初始化。构造函数用元素个数来决定 vector
对象保存元素的 个数,元素值指定每个元素的初始值】

三.vector对象动态增长:

vector 对象(以及其他标准库容器对象)的重要属性就在于可以在运行时高效地添加元素。

注意:因为 vector 增长的效率高,在元素值已知的情况下,最好是动态地添加元素。

实例1:

vectortest;//建立一个vector,int为数组元素的数据类型,test为动态数组名

简单的使用方法如下:

vector<int>test;//建立一个vector
test.push_back(1);
test.push_back(2);//把1和2压入vector,这样test[0]就是1,test[1]就是2

实例2:

vector<vector<Point2f> > points; //定义一个二维数组
points[0].size();  //指第一行的列数

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()​;
实例

1.pop_back()&push_back(elem)实例在容器最后移除和插入数据

实例

#include <string.h>
#include <vector>
#include <iostream>
using namespace std;
 
int main()
{
    vector<int>obj;//创建一个向量存储容器 int
    for(int i=0;i<10;i++) // push_back(elem)在数组最后添加数据 
    {
        obj.push_back(i);
        cout<<obj[i]<<",";    
    }
 
    for(int i=0;i<5;i++)//去掉数组最后一个数据 
    {
        obj.pop_back();
    }
 
    cout<<"\n"<<endl;
 
    for(int i=0;i<obj.size();i++)//size()容器中实际数据个数 
    {
        cout<<obj[i]<<",";
    }
 
    return 0;
}
输出结果为:

0,1,2,3,4,5,6,7,8,9,

0,1,2,3,4,

2.clear()清除容器中所有数据

实例

#include <string.h>
#include <vector>
#include <iostream>
using namespace std;
 
int main()
{
    vector<int>obj;
    for(int i=0;i<10;i++)//push_back(elem)在数组最后添加数据 
    {
        obj.push_back(i);
        cout<<obj[i]<<",";
    }
 
    obj.clear();//清除容器中所以数据
    for(int i=0;i<obj.size();i++)
    {
        cout<<obj[i]<<endl;
    }
 
    return 0;
}
输出结果为:

0,1,2,3,4,5,6,7,8,9,

3.排序

实例

#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    vector<int>obj;
    obj.push_back(1);
    obj.push_back(3);
    obj.push_back(0); 
    sort(obj.begin(),obj.end());//从小到大
    cout<<"从小到大:"<<endl;
    for(int i=0;i<obj.size();i++)
    {
        cout<<obj[i]<<",";  
    }  
    cout<<"\n"<<endl; 
    cout<<"从大到小:"<<endl;
    reverse(obj.begin(),obj.end());//从大到小 
    for(int i=0;i<obj.size();i++)
    {
        cout<<obj[i]<<",";
    }
    return 0;
}
输出结果为:
从小到大:
0,1,3,
从大到小:
3,1,0,
1.注意 sort 需要头文件 #include <algorithm>
2.如果想 sort 来降序,可重写 sort
bool compare(int a,int b) 
{ 
    return a< b; //升序排列,如果改为return a>b,则为降序 
} 
int a[20]={2,4,1,23,5,76,0,43,24,65},i; 
for(i=0;i<20;i++) 
    cout<< a[i]<< endl; 
sort(a,a+20,compare);

4.访问(直接数组访问&迭代器访问)

实例

#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std; 
int main()
{
    //顺序访问
    vector<int>obj;
    for(int i=0;i<10;i++)
    {
        obj.push_back(i);   
    }  
    cout<<"直接利用数组:"; 
    for(int i=0;i<10;i++)//方法一 
    {
        cout<<obj[i]<<" ";
    } 
    cout<<endl; 
    cout<<"利用迭代器:" ;
    //方法二,使用迭代器将容器中数据输出 
    vector<int>::iterator it;//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素 
    for(it=obj.begin();it!=obj.end();it++)
    {
        cout<<*it<<" ";
    }
    return 0;
}
输出结果为:
直接利用数组:0 1 2 3 4 5 6 7 8 9 
利用迭代器:0 1 2 3 4 5 6 7 8 9

5.二维数组两种定义方法(结果一样)

方法一
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int N=5, M=6; 
    vector<vector<int> > obj(N); //定义二维动态数组大小5行 
    for(int i =0; i< obj.size(); i++)//动态二维数组为5行6列,值全为0 
    { 
        obj[i].resize(M); 
    } 
 
    for(int i=0; i< obj.size(); i++)//输出二维动态数组 
    {
        for(int j=0;j<obj[i].size();j++)
        {
            cout<<obj[i][j]<<" ";
        }
        cout<<"\n";
    }
    return 0;
}
方法二
#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std; 
int main()
{
    int N=5, M=6; 
    vector<vector<int> > obj(N, vector<int>(M)); //定义二维动态数组5行6列  
    for(int i=0; i< obj.size(); i++)//输出二维动态数组 
    {
        for(int j=0;j<obj[i].size();j++)
        {
            cout<<obj[i][j]<<" ";
        }
        cout<<"\n";
    }
    return 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 

2、重要说明

vector 的元素不仅仅可以是 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升序排序。  
  bool operator< (const rect &a)  const  
    {  
        if(id!=a.id)  
            return id<a.id;  
        else  
        {  
            if(length!=a.length)  
                return length<a.length;  
            else  
                return width<a.width;  
        }  
    }  
}Rect;  
int main()  
{  
    vector<Rect> vec;  
    Rect rect;  
    rect.id=1;  
    rect.length=2;  
    rect.width=3;  
    vec.push_back(rect);  
    vector<Rect>::iterator it=vec.begin();  
    cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;      
return 0;  
}  

3、算法

(1) 使用reverse将元素翻转:需要头文件 #include<algorithm>

reverse(vec.begin(),vec.end());将元素翻转,即逆序排列!

(在vecto r中,如果一个函数中需要两个迭代器,一般后一个都不包含)

(2) 使用 sort 排序:需要头文件 #include<algorithm>

sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).

可以通过重写排序比较函数按照降序比较,如下:

(3)定义排序比较函数:

bool Comp(const int &a,const int &b)
{
    return a>b;
}

调用时: sort(vec.begin(),vec.end(),Comp),这样就降序排序。

(4)输出Vector的中的元素

vector<float> vecClass; 

int nSize = vecClass.size();   

 //打印 vecClass,方法一:  

for(int i=0;i<nSize;i++)    
{    
   cout<<vecClass[i]<<"     ";    
}    
   cout<<endl;   
需要注意的是:以方法一进行输出时,数组的下表必须保证是整数。

 //打印 vecClass,方法二:     

for(int i=0;i<nSize;i++)    
{    
   cout<<vecClass.at(i)<<"     ";    
}    
   cout<<endl;    
//打印 vecClass,方法三:输出某一指定的数值时不方便

for(vector<float>::iterator it = vecClass.begin();it!=vecClass.end();it++)    
{    
    cout<<*it<<"   ";    
}    
    cout<<endl;    

(5)二维数组的使用:

#include "stdafx.h"  
#include <cv.h>  
#include <vector>   
#include <iostream>   
using namespace std;  
int main()  
{  
    using namespace std;  
    int out[3][2] = { 1, 2,   
             3, 4,  
            5, 6 };  
    vector <int*> v1;  
    v1.push_back(out[0]);  
    v1.push_back(out[1]);  
    v1.push_back(out[2]);  
    cout << v1[0][0] << endl;//1  
    cout << v1[0][1] << endl;//2  
    cout << v1[1][0] << endl;//3  
    cout << v1[1][1] << endl;//4  
    cout << v1[2][0] << endl;//5  
    cout << v1[2][1] << endl;//6  
    return 0;  
}  

(6)常用算法

 #include<algorithm>
 //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列
 sort(a.begin(),a.end());
 //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1
 reverse(a.begin(),a.end());
  //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素
 copy(a.begin(),a.end(),b.begin()+1);
 //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置
  find(a.begin(),a.end(),10);

c++之vector 及 二维容器vector<vector<int>>初始化方法 及 三维数组初始化

可以参考这个走你

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值