0
点赞
收藏
分享

微信扫一扫

php反序列化学习(1)

两岁时就很帅 2024-05-28 阅读 27

一. vector

1. 赋值操作

1.1 函数原型

vector& operator=(const vector& vec);//重载等号操作符
assign(beg,end);//将[beg,end)区间中的数据拷贝赋值给本身
assign(n,elem);//将n个elem拷贝赋值给本身

1.2 demo

#include <iostream>
#include <vector>
using namespace std;

void out_vector(vector<int> &vec)//构造函数打印数组,方便验证
{
  for(vector<int>::iterator it=vec.begin();it<vec.end();it++)
  cout<<*it<<" ";
  cout<<endl;
}

int main()
{
  vector<int> v1;
  for(int i=0;i<5;i++)//创建道具v1并给其插入元素,为之后验证服务
  	v1.push_back(i+1);
  out_vector(v1);//打印验证,第1行应输出1 2 3 4 5

  vector<int> v2;
  v2=v1;//赋值方法1:重载等号运算符
  out_vector(v2);//打印验证,第2行应输出1 2 3 4 5

  vector<int> v3;
  v3.assign(v2.begin()+1,v2.end()-1);//赋值方法2:区间数据拷贝赋值
  out_vector(v3);//打印验证,第3行应输出2 3 4

  vector<int> v4;
  v4.assign(4,3);//赋值方法3:若干个数据拷贝赋值
  out_vector(v4);//打印验证,第4行应输出3 3 3 3

  return 0;
}

2. resize

2.1 函数原型

void resize (size_type n);//
void resize (size_type n, const value_type& val);

调整容器的大小,使其包含n个元素。

2.2 说明

  1. 如果n小于当前容器的大小,则将内容减少到其前n个元素,并删除超出范围的元素(并销毁它们)。
  2. 如果n大于当前容器的大小,则通过在末尾插入所需数量的元素来扩展内容,以达到n的大小。如果指定了val,则将新元素初始化为val的副本,否则将对它们进行值初始化。
  3. 如果n也大于当前容器容量,将自动重新分配已分配的存储空间。
    请注意,此函数通过插入或擦除容器中的元素来更改容器的实际内容。

2.3 demo

// resizing vector
#include <iostream>
#include <vector>
 
int main ()
{
  std::vector<int> myvector;
 
  // set some initial content:
  for (int i=1;i<=10;i++) myvector.push_back(i);
  
  for (int i=0;i<myvector.size();i++)
    std::cout << ' ' << myvector[i];  // 1 2 3 4 5 6 7 8 9 10
  std::cout << '\n';
 
 
  myvector.resize(5);
  
  for (int i=0;i<myvector.size();i++)
    std::cout << ' ' << myvector[i]; // 1 2 3 4 5
  std::cout << '\n';
  
  myvector.resize(8,100);
  
  for (int i=0;i<myvector.size();i++)
    std::cout << ' ' << myvector[i]; //1 2 3 4 5 100 100 100
  std::cout << '\n';
  
  
  myvector.resize(12);
 
  for (int i=0;i<myvector.size();i++)
    std::cout << ' ' << myvector[i]; //1 2 3 4 5 100 100 100 0 0 0 0
  std::cout << '\n';
 
  return 0;
}

3. reserve&resize的区别,size和capacity的区别

参考博客:https://blog.csdn.net/u013575812/article/details/51171135

vector中这两个属性很容易弄混淆。
size是当前vector容器真实占用的大小,也就是容器当前拥有多少个元素。
capacity是指在发生realloc前能允许的最大元素数,即预分配的内存空间。

当然,这两个属性分别对应两个方法:resize()和reserve()。

使用resize(),容器内的对象内存空间是真正存在的。
使用reserve()仅仅只是修改了capacity的值,容器内的对象并没有真实的内存空间(空间是"野"的)。
此时请勿使用[]操作符访问容器内的对象,很可能出现数组越界的问题。

#include <iostream>
#include <vector>
 
using std::vector;
int main(void)
{
	vector<int> v;
	std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;
	v.reserve(10);
	std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;
	v.resize(10);
	v.push_back(0);
	std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;
 
	return 0;
}

在这里插入图片描述
注:对于reserve(10)后 接着直接使用[]访问越界报错(内存是野的),大家可以加一行代码试一下,我这里没有贴出来。
这里直接用[]访问,vector退化为数组,不会进行越界的判断。此时推荐使用at(),会先进行越界检查。

4. at

https://www.cnblogs.com/xiangtingshen/p/12326709.html
[]和at()的区别在于[]不检查索引是否有效,而at()在遇到无效索引时会抛出out_of_range异常.
c++标准不要求vector::operator[]进行下标越界检查,原因是为了效率,总是强制下标越界检查会增加程序的性能开销

5. 插入元素

insert //	通过在指定位置的元素之前插入新元素来扩展该容器,通过插入元素的数量有效地增加容器大小
push_back  //在容器的最后一个元素之后添加一个新元素
emplace_back  //在 vector 的末尾插入一个新的元素,紧跟在当前的最后一个元素之后
emplace  //通过在 position(参数)位置处插入新元素 args(参数)来扩展容器

insert

https://docs.naivesystems.com/kb/vector-insert-in-c-plus-plus
https://www.cnblogs.com/shona/p/10789721.html
insert() O(N) //插入元素,O(n)的复杂度

#include<vector>  
#include<iostream>  
using namespace std;  
 
int main()  
{  
    vector<int> v(3);  
    v[0]=2; //v[0]是第0个元素 
    v[1]=7;  
    v[2]=9;  
    v.insert(v.begin(),8);//在最前面插入新元素。  
    v.insert(v.begin()+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<<" ";    8 2 1 7 9 3 1 1 1 1 4 4
    }  
    cout<<endl;
	return 0;
}  

push_back和emplace_back的区别

https://www.cnblogs.com/nntzhc/p/14073569.html
1、push_back() 在底层实现时,会优先选择调用移动构造函数,如果没有才会调用拷贝构造函数。
2、push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
3、emplace_back不能完全代替push_back。

举报

相关推荐

0 条评论