【C++】vector 用法(全)

目录

常用

初始化

迭代器

插入元素

删除元素

取最值

查找元素

合并

排序

举例


常用

vector<int> vec;

vec.size();     // 实际元素个数

vec.begin();    // 指向第一项
vec.end();      // 指到最尾有效元素的下一位

vec.front();    // 第一项值
vec.back();     // 最后一项值

vec.empty();    // 判断是否为空
vec.clear();    // 清空

初始化

可以通过数组、vector进行初始化。注意:vector的begin和end使用,vector.end()。左闭右开。

vector<int> myVec;       // 默认为空
vector<int> myVec(7);    // 初始化为7个0
vector<int> myVec(7, 4); // 初始化为7个4  

// 通过数组初始化,指明首位地址,不包含end
int myList[] = { 32, 71, 12, 45, 26, 80, 53, 33 };
std::vector<int> listVec(myList+1, myList+5);  // 71 12 45 26 
std::vector<int> listVec2(std::begin(myList)+1, std::end(myList));  // 71 12 45 26 80 53 33

// 通过迭代器初始化
std::vector<int> iterVec(listVec2.begin()+1, listVec2.end()-2);  // 12 45 26 80

// 通过vector初始化
std::vector<int> vecVec(iterVec);  // 12 45 26 80
std::vector<int> vecVec2 = iterVec;  // 12 45 26 80

for (auto ve : vecVec) {
    std::cout<< ve << ' ';
}
std::cout<< std::endl;

迭代器

#include <iostream>
#include <vector>
#include <iterator>

// 声明
std::vector<int>::iterator it;
std::vector<int> vec;

// 遍历
for (std::vector<int>::iterator it=vec.begin(); it != vec.end(); it++) {
    std::cout << *it << endl;
    ...
}

// 迭代器效果类似于指针

插入元素

末尾添加:push_back();  每次添加新元素时,vector会将已有元素拷贝至新地址,清空旧内存,添加新元素,保证新分配的内存够用。

任意插入:insert; 

#include<vector>  
#include<iostream>  
using namespace std;  
 
int main()  
{  
    vector<int> v(3);  
    v[0]=2; 
    
    v.push_back(1);
    v.push_back(3); 

    v.insert(v.begin(),8);   //在最前面插入新元素。  
    v.insert(v.begin()+2,1); //在迭代器中下标为2处插入新元素1  
    v.insert(v.end(),3);     //在向量末尾追加新元素。  
 
	v.insert(v.end(),4,1);   //在尾部插入4个1
 
	int a[] = {1,2,3,4};
	v.insert(v.end(),a[1],a[3]); //在尾部插入a[1]个a[3]
 
    vector<int>::iterator it;  
    for(it=v.begin(); it!=v.end();it++)  
    {  
        cout<<*it<<" ";  
    }  
    cout<<endl;
 
	return 0;
}  

删除元素

末尾删除:pop_back();

删除指定位置元素:erase();

删除后会改变vector大小。

remove不会改变大小 

vector<int> v;

v.push_back(3);  // 3
v.push_back(4);  // 3 4

v.insert(v.begin()+2, 5); // 3 4 5

vector<int>::iterator itpop = v.end()-1;
cout << *itpop << endl;  // 5

v.pop_back();  // 3 4 

v.insert(v.end(), 6); // 3 4 6

v.erase(v.begin() + 1);  // 3 6
v.erase(v.begin(), v.end()); //删除所有项

vector<int> iterator itera = v.end()-1;
v.erase(itera);  //3

vector<int> iterator ite = remove(v.begin(), v,end(), 3);
// remove后v.size() 不会变

取最值

用法:max_element(v.begin(), v.end());   或  max_element(std::begin(v), std::end(v)) ;

注意:max_element 、min_element  返回的是vector<double>::iterator。取最值要加 *。取下标要 distance(v.begin(), biggest); 

#include <algorithm>
#include <iostream>
 
int main()
{
    std::vector<double> v {1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0};
 
    // 两种用法
    std::vector<double>::iterator biggest = std::max_element(std::begin(v), std::end(v));
    std::vector<double>::iterator biggest = std::max_element(v.begin(), v.end());

    auto smallest = std::min_element(v.begin(), v.end());
       
    std::cout << "Max element is " << *biggest<< " at position " << std::distance(std::begin(v), biggest) << std::endl;

    std::cout << "Min element is " << *smallest<< " at position " << std::distance(std::begin(v), smallest) << std::endl;
}
  
输出:
 
Max element is 5 at position 4
Min element is 1 at position 0

查找元素

#include <algorithm>
using std::count;

vector<int> v{ 4, 7, 9, 1, 2, 5 };

// count 遍历整个数组,返回bool
if (count(v.begin(), v.end(), key)) { }

// find 找到后立即返回,内部通过迭代器==对比实现, auto it2 = find(v.begin(), v.end(), key);
std::vector<int>::iterator it1;
if (find(v.begin(), v.end(), key) != v.end()) {
    return true;
}

// binary_search() 对有序数组二分查找,返回bool型,O(logN)
sort(v.begin(), v.end());
if (binary_search(v.begin(), v.end(), key)) {
}

合并

vector<int> v1 = {1,23,4,5,6,67};
vector<int> v2 = {3,4,5,6,67,7};
vector<int> v3;
vector<int> v4;
vector<int> v5;
vector<int> v6;

// insert 从v3末尾开始插入
v3.insert(v3.end(), v1.begin(), v1.end());  // 1 23 4 5 6 67 
v3.insert(v3.end(), v2.begin(), v2.end());  // 1 23 4 5 6 67 3 4 5 6 67 7 

// copy 必须保证目的数组长度够大
v4.resize(v3.size());
std::copy(v3.begin(), v3.end(), v4.begin()); // 1 23 4 5 6 67 3 4 5 6 67 7 

// copy 情形2
v4.resize(v3.size() + 3);
std::copy(v3.begin(), v3.end()-3, v4.begin()); // 1 23 4 5 6 67 3 4 5 0 0 0 0 0 0 
std::copy(v3.begin(), v3.end(), v4.begin());   // 1 23 4 5 6 67 3 4 5 6 67 7 0 0 0

// merge 必须保证目的数组长度够大
v5.resize(v1.size() + v2.size());
std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v5.begin()); // 1 3 4 5 6 23 4 5 6 67 67 7

v6.resize(v1.size() + v2.size());
std::merge(v1.begin()+3, v1.end(), v2.begin()+2, v2.end(), v6.begin()); // 5 5 6 6 67 67 7 0 0 0 0 0 

排序

用法:sort(v.begin(), v.end(),less<int>());  默认为升序。

注意:sort中最后一项的理解 less:从小开始,升序,greater:从大开始,降序。rbegin() = reverse begin,rend() = reverse end()。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>  //std::sort()

int main()
{
    int nums[] = {32,71,12,45,26,80,53,33};        
    vector<int> vc (nums, nums+8);  // 初始化
    
    std::cout << "init :";
    for (std::vector<int>::iterator it=vc.begin(); it!=vc.end(); ++it)
        std::cout << ' ' << *it;
    std::cout << '\n'; 
    
    // sort默认升序:
    std::sort(vc.begin(), vc.end());    
    // 等效于
    std::sort(vc.begin(), vc.end(), less<int>());  // 12 26 32 33 45 53 71 80
    
    std::cout << " less :";
    for (std::vector<int>::iterator it=vc.begin(); it!=vc.end(); ++it)
        std::cout << ' ' << *it;
    std::cout << '\n'; 
    
    // sort降序:
    std::sort(vc.rbegin(), vc.rend()); // 80 71 53 45 33 32 26 12
    // 等效于
    std::sort(vc.begin(), vc.end(), greater<int>()); // 80 71 53 45 33 32 26 12
    
    std::cout << " greater :";
    for (std::vector<int>::iterator it=vc.begin(); it!=vc.end(); ++it)
        std::cout << ' ' << *it;
    std::cout << '\n';

    // 翻转
    std::reverse(arr.begin(),arr.end()); 
}
// 特殊用法
std::sort(vc,begin(), vc.begin()+4);

bool myfunction (int i,int j) 
{ 
    return (i<j); 
}

struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;

std::sort(myvector.begin()+4, myvector.end(), myfunction); 
std::sort (myvector.begin(), myvector.end(), myobject); 
#include <vector>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
struct Point2
{
	int x;
	int y;
};

bool GreaterSort (Point2 a,Point2 b) { return (a.x>b.x); }
bool LessSort (Point2 a,Point2 b) { return (a.x<b.x); }

int main()
{
	vector<Point2> aaa;
	Point2 temp;
	temp.x=1;
	temp.y=1;
	aaa.push_back(temp);
	temp.x=2;
	temp.y=2;
	aaa.push_back(temp);	
	temp.x=3;
	temp.y=3;
	aaa.push_back(temp);

	sort(aaa.begin(),aaa.end(),GreaterSort);//降序排列
	cout<<"Greater Sort:"<<endl;
	for (int i =0;i<aaa.size();i++)
	{
		cout<<aaa[i].x<<"	"<<aaa[i].y<<endl;
	}
 
	sort(aaa.begin(),aaa.end(),LessSort);//升序排列
	cout<<"Less Sort:"<<endl;
	for (int i =0;i<aaa.size();i++)
	{
		cout<<aaa[i].x<<"	"<<aaa[i].y<<endl;
	}
 
	return 0;
}

举例

// sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector

bool myfunction (int i,int j) { return (i<j); }

struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;

int main () {
  int myints[] = {32,71,12,45,26,80,53,33};
  
  std::vector<int> testfan (myints+1, myints+5);
  
  for (std::vector<int>::iterator it2=testfan.begin(); it2 != testfan.end(); it2++){
    std::cout<< " " <<  *it2;
  }

//71 12 45 26
  
   std::cout<< "dfsfsfs " ;
  
    std::vector<int> tes (testfan.begin()+1, testfan.end()-2);
  
  for (std::vector<int>::iterator it2=tes.begin(); it2 != tes.end(); it2++){
    std::cout<< " " <<  *it2;
  }
  
 //  12
  
  std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33

  // using default comparison (operator <):
  std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33

  // using function as comp
  std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)

  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

//myvector contains: 12 26 32 33 45 53 71 80
  return 0;
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值