c++ vector

介绍

vector是最常用的容器之一,功能十分强大,可以储存、管理各种类型的数据。在很多情况下可以用来代替功能比较局限的普通数组。向量(Vector)是一个封装了动态大小数组的顺序容器。

常用函数

push_back()  //在数组的最后添加一个数据
pop_back() //去掉数组的最后一个数据
at()  //得到编号位置的数据
begin() //得到数组头的指针
end() //得到数组的最后一个单元+1的指针 
find()  //判断元素是否存在
front() //得到数组头的引用
back() //得到数组的最后一个单元的引用
max_size() //得到vector最大可以是多大
capacity() //当前vector分配的大小
size() //当前使用数据的大小
capacity(); //返回a在内存中总共可以容纳的元素个数
a.reserve(100); //改变当前vecotr所分配空间的大小将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100
a.resize(10); //将a的现有元素个数调至10个,多则删,少则补,增加的元素其值默认为0
a.resize(10,2); //将a的现有元素个数调至10个,多则删,少则补,增加的元素其值为2
erase() //删除指针指向的数据项
clear() //清空当前的vector
rbegin() //将vector反转后的开始指针返回(其实就是原来的end-1)
rend() //将vector反转构的结束指针返回(其实就是原来的begin-1)
empty() //判断vector是否为空
swap() //与另一个vector交换数据
a.swap(b); //b为向量,将a中的元素和b中的元素进行整体性交换
reverse(obj.begin(),obj.end()); // 反向迭代器,实现元素对调 

find()用法

find(数组的头地址, 数组的尾地址, 要找的数)

find(nums.begin(), nums.end(), target);
    
//返回的是target第一次出现的地址
//如果没有找到返回尾地址nums.end()
#include 
#include 
#include 
using namespace std;
using std::vector;
using std::cout;
using std::endl;
int main() {
    vector nums = {2,7,8,8,9};
    int target = 8;
    vector::iterator loc = find(nums.begin(), nums.end(), target);
 
    if (loc == nums.end()) {
        cout << "数组中没有" << target << endl;
    }
    else {
        cout << "数组中有" << target << endl;
        cout << "并且, 它的第一次出现的位置为:" << loc - nums.begin() << endl;
    }
}

访问数据


#include 
using namespace std;
int main() {
    //顺序访问
    vectorobj;
    for(int i=0;i<10;i++) {
        obj.push_back(i);//存储数据
    }
  
    //方法一数组访问
    cout<<"直接利用数组:";
    for(int i=0;i<10;i++) {
        cout<::iterator it;
    //声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素
    for(it=obj.begin();it!=obj.end();it++) {
        cout<<*it<<" ";
    }
    return 0;
}

插入数据(insert)

insert (position, x );
insert (position, n, x );
insert (position, first, last );
插入新的元素,
第一个函数,在迭代器指定的位置前插入值为x的元素
第二个函数,在迭代器指定的位置前插入n个值为x的元素
第三个函数,在迭代器指定的位置前插入另外一个容器的一段序列迭代器first到last

insert()  //往vector任意位置插入一个元素,指定位置或者指定区间进行插入,
 //第一个参数是个迭代器,第二个参数是元素。返回值是指向新元素的迭代器
 
vector vA;
vector::iterator it;
 
//指定位置插入
//iterator insert(const_iterator _Where, const _Ty& _Val)
//第一个参数是个迭代器位置,第二个参数是元素
it = vA.insert(vA.begin(),2); //往begin()之前插入一个int元素2 (vA={2,1}) 此时*it=2
  
//指定位置插入
//void insert(const_iterator _Where, size_type _Count, const _Ty& _Val) 
//第一个参数是个迭代器位置,第二个参数是要插入的元素个数,第三个参数是元素值
it = vA.insert(vA.end(),2,3);//往end()之前插入2个int元素3 (vA={2,1,3,3}) 此时*it=3
 
//指定区间插入
//void insert(const_iterator _Where, _Iter _First, _Iter _Last) 
vector vB(3,6);  //vector<类型>标识符(最大容量,初始所有值)
it = vA.insert(vA.end(),vB.begin(),vB.end()); //把vB中所有元素插入到vA的end()之前 (vA={2,1,3,3,6,6,6})
//此时*it=6,指向最后一个元素值为6的元素位置

erase()删除操作

erase ( position );
erase (first, last );
删除元素或一段序列

#include 
#include 
#include 
using namespace std;
 
int main() {
    vectorobj;//创建一个向量存储容器 int
    for(int i=0;i<10;i++){ // push_back(elem)在数组最后添加数据
        obj.push_back(i);
        cout<

排序

sort 的头文件

从小到大


#include 
#include 
#include 
using namespace std;
 
int main() {
	int a[] = {8,6,2,9,3,5,4,1,7,10};
 	vector arr(a, a+5);
	sort(arr.begin(),arr.end()); 
 	for(int i = 0; i 

从大到小

sort默认排序从小到大,使用greater()


#include 
#include 
#include 
using namespace std;
 
int main() {
	int a[] = {8,6,2,9,3,5,4,1,7,10};
 	vector arr(a, a+5);
	sort(arr.begin(),arr.end(),greater()); 
 	for(int i = 0; i 

自定义函数


#include 
#include 
#include 
using namespace std;
 
bool cmp_max(int x,int y){
	return x > y;
}
 
int main() {
	int a[] = {8,6,2,9,3,5,4,1,7,10};
 	vector arr(a, a+5);
	sort(arr.begin(),arr.end(),cmp_max); // 可以用lambda
    // sort(arr.begin(),arr.end(),[](int x,int y){return x>y;});
 	for(int i = 0; i 

删除元素

  • 使用 vector库函数“erase”删除使用erase函数后容器size自动-1
int removeElement(vector& nums, int detarget) {
        for (int i = 0; i < nums.size(); i++){
            if(nums[i] == detarget){
                nums.erase(nums.begin() + i); // 迭代器与索引的结合
                i--; //由于容器size-1,还按原来的i的话相当于自动右移一位而漏掉一个元素
            }
        }
        return nums.size();      
    }
  • 使用 vector库函数“swap和pop_back()",由于pop_back删除的是最后一个元素,所以先移位再删除
int removeElement(vector& nums, int detarget) {
        for (int i = 0; i < nums.size(); i++){
            if(nums[i] == detarget){   
                swap(nums[i], nums[nums.size() - 1]); //将要删除的元素交换到最后
                nums.pop_back(); 
                i--; //这里的i--与上面的作用一样
            }
        }
        return nums.size();      
    }
  • 使用迭代器循环删除
string qs = "aa";
vector::iterator iter;
iter = v->begin();
while(iter!=v->end()){
    if(!iter->name.compare(qs)){
        iter = v->erase(iter);//使用erase返回的迭代器重新赋值iter
    }else{
        iter++;
    }    
}

你可能感兴趣的:(杂七杂八,c++,std,vector)