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