vector(向量)基本操作

vector作为参数的三种传参方式

c++中常用的vector容器作为参数时,有三种传参方式,分别如下(为说明问题,用二维vector):

function1(std::vector<std::vector<int> > vec),传值
function2(std::vector<std::vector<int> >& vec),传引用
function3(std::vector<std::vector<int> >* vec),传指针
注意,三种方式分别有对应的const形式,不在此讨论。

三种方式对应的调用形式分别为:

function1(vec),传入值
function2(vec),传入引用
function3(&vec),传入地址
三种方式的效果分别为:

会发生拷贝构造
不会发生拷贝构造
不会发生拷贝构造
https://www.cnblogs.com/xiaoxi666/p/6843211.html

vector初始化

vector<int> ilist4(7);

默认值初始化,ilist4中将包含7个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此ilist4被初始化为包含7个0。

vector<int> ilist5(7,3);
指定值初始化,ilist5被初始化为包含7个值为3的int
https://blog.youkuaiyun.com/veghlreywg/article/details/80400382

将一个vector的内容赋值给另一个vector

一、初始化构造时拷贝
vector<int> tem(list);
相当于复制了一份数据,list中的数据不变。

二、assign
vector<int> temlist;
temlist.assign(list.begin(), list.end());
一样的复制了一份数据,list中的数据不变。

三、swap
vector<int> temlist;
temlist.swap(list);
将list中数据全部移到temlist中,此时list中为空了

四、insert
temlist.insert(temlist.end(), list.begin(), list.end());
将list中的数据,全部插入到temlist的末尾。相当于复制了一份数据
https://blog.youkuaiyun.com/hust_bochu_xuchao/article/details/72850862

vector实现二维数组

初始化:
//得到一个5行3列的数组
//由vector实现的二维数组,可以通过resize()的形式改变行、列值

vector<vector<int>> array(5);
for (int i = 0; i < array.size(); i++)
    array[i].resize(3);

遍历:
(1)迭代器
    for(iter = vec.begin(); iter != vec.end(); iter++)
    {
        vec_tmp = *iter;
        for(it = vec_tmp.begin(); it != vec_tmp.end(); it++)
            cout << *it << " ";
        cout << endl;
    }

(2)下标
    for (i = 0; i < vec.size(); i++)
    {
        for(j = 0; j < vec[0].size(); j++)
            cout << vec[i][j] << " ";
        cout << endl;
    }
https://blog.youkuaiyun.com/a819825294/article/details/52088732

vector三维数组初始化

三维数组初始化
定义一个维度为2x4x2的vector三维数组
    std::vector<std::vector<std::vector<int>>> a(2);//创建2个vector<vector<int>>类型的数组
    for (int n = 0; n < 2; n++)
    {
        a[n].resize(4);
    }//要先对二维数组设定大小

    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            a[i][j].resize(2);
        }//之后才能对三维数组设定大小,否则内存出错
    }
https://blog.youkuaiyun.com/bingboygogo/article/details/71272377

取vector最后一个元素back

intVector[intVector.size() - 1];
intVector.back();
https://blog.youkuaiyun.com/mitu405687908/article/details/51148107
https://blog.youkuaiyun.com/Angry_chicken_wings/article/details/5799639

判断vector中某值是否存在find

vector<int> vec;
vector<int>::iterator it;
int value=24;
 
it=find(vec.begin(),vec.end(),value);
 
if (it!=vec.end())
{
//vec中存在value值
}
else
{
//vec中不存在value值
}
https://zhidao.baidu.com/question/251277734.html


c++ string.find()函数

//find函数返回类型 size_type
string s("1a2b3c4d5e6f7g8h9i1a2b3c4d5e6f7g8ha9i");
string flag;
string::size_type position;
 
//find 函数 返回jk 在s 中的下标位置 
position = s.find("jk");
 if (position != s.npos)  //如果没找到,返回一个特别的标志c++中用npos表示,我这里npos取值是4294967295,
 {
  cout << "position is : " << position << endl;
 }
 else
 {
  cout << "Not found the flag" + flag;
 } 
https://blog.youkuaiyun.com/monkeyduck/article/details/23541073
 

vector统计元素个数

#include<algorithm>

int n = count(v.begin(), v.end(), 1);  // 返回1出现的次数
https://blog.youkuaiyun.com/qq_36122764/article/details/82429976
 

插入元素insert

vec.insert(vec.begin()+i, a);  // 在第i+1个元素前面插入a(在第i个元素的后面插入a)
https://blog.youkuaiyun.com/duan19920101/article/details/50717748
 

删除元素erase

vector::erase()

//删除v1.begin() + 1和v1.begin() + 2两个元素
v1.erase(v1.begin() + 1, v1.begin() + 3);

如果是删除指定位置的元素时:返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;
https://blog.youkuaiyun.com/duan19920101/article/details/50717748

vector删除元素之pop_back(),erase(),remove()

采用通用算法remove()来删除vector容器中的元素,大家可以看到这里说的是算法,而不是方法;即vector没有remove()成员,这里的remove是algorithm中的remove函数。

不同的是:采用remove()一般情况下不会改变容器的大小,而pop_back()与erase()等成员函数会改变容器的大小。

erase()
这个操作会让容器的size减小,减小的个数为删除的元素个数。

remove()
remove(mylist.begin(), mylist.end(), 4);
https://blog.youkuaiyun.com/dongyanxia1000/article/details/52838922

vector::erase() 函数在容器内元素比较多,删除元素的代价会比较大,他会把后边的元素移动至删除位置,改变vector的size但是并不改变capacity,换句话说并不会释放这些删除元素的内存
https://blog.youkuaiyun.com/Bing_Lee/article/details/102515442
 

清空swap

 vector(v).swap(v);将v的内存空洞清除
 vector().swap(v);清空vec
https://www.cnblogs.com/youxin/p/4351024.html

clear后,size变为了0,capacity没有变化。(clear后,更改了迭代器的范围,就相当于清除了容器中的元素,实际上并没有释放内存)

vector<int> v;
vector<int>().swap(v);
https://blog.youkuaiyun.com/wangshubo1989/article/details/50359750

如果vector中存放的是指针,那么当vector销毁时,这些指针指向的对象不会被销毁,那么内存就不会被释放。
for (vector<void *>::iterator it = v.begin(); it != v.end(); it ++) 
    if (NULL != *it) 
    {
        delete *it; 
        *it = NULL;
    }
v.clear();
https://www.cnblogs.com/summerRQ/articles/2407974.html

vector<int>(v3).swap(v3): 2  
vector<int>().swap(v3): 0  
https://blog.youkuaiyun.com/u012861978/article/details/47425689
释放vector内存
vector<int>().swap(vec);

声明形如vector<> vec;的不是new出来而是作为普通变量的那么不需要delete, 在变量超出作用域时会自动回收
如果是用*vec = new vector<>()这种方式动态创建的vector那么需要delete vec
vec里存放的元素如果不是指针那么不用delete, 这些元素在vec被释放时会被一起释放
vec里存放的元素是指针并且这些指针都是指向自己new的对象的话, 那么需要自己一个个delete
https://zhidao.baidu.com/question/242767717391714204.html
如果map,vector中存放了指针,指向手动分配的内存区域,则map,vector生命周期结束时,需要手动释放该内存区。map,vector的析构中带有垃圾回收机制,不需手动清空。记得,手动分配,才需手动清空
https://blog.youkuaiyun.com/PengPengBlog/article/details/53081839
 

排序sort

sort(vect.begin(), vect.end());

//此时相当于调用,升序排序
sort(vect.begin(), vect.end(), less<int>());
https://blog.youkuaiyun.com/ihadl/article/details/7400929
 

reverse函数:反转容器内容

#include <algorithm>

std::reverse(myvector.begin(),myvector.end())
https://blog.youkuaiyun.com/u012877472/article/details/49557077

vector所有元素相加求和accumulate

#include <numeric>

vector<int> va(&arr[0],&arr[5]);
 
int sum=accumulate(va.begin(),va.end(),0); 
https://blog.youkuaiyun.com/Fly_as_tadpole/article/details/82710771

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WX Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值