vector容器

先总结一些,等以后碰到了再增加。

1.vector(动态数组)

1.动态扩展,增加长度,动态数组

2.数组内数据通常存储在栈上,而vector<int> 中数据存储在堆上。

动态扩展:

像水杯装水一样,如果容量不足以承载水,那么换一个更大的杯子(不同的更大空间),再将原来的水装进去更大容量杯子。

动态扩展并不是在原空间之后续接新空间,而是找到比原来更大的内存空间,将原数据拷贝到新空间,释放原空间。

2.vector形象图 

3.vector的构造函数

代码

#include<bits/stdc++.h>
using namespace std;

int main () {
	// 默认构造函数 
	vector<int> v;
	puts("请输入五个数字,中间空格相隔:");
	for(int i = 0; i < 5; i ++) {
		int x; cin >> x;
		v.push_back(x);
	}
	puts("默认构造v :"); for(auto x:v) cout << x <<" ";
	cout << endl;
	
	// 拷贝构造函数
	vector<int> v1(v.begin(),v.end());
	vector<int> v2(v1.rbegin(),v1.rend());
	puts("拷贝构造v1 :");
	for(auto x:v1) cout << x << " "; cout << endl;
	puts("逆序:拷贝构造v2 :");
	for(auto x:v2) cout << x << " "; cout << endl;
	
	//n个elem拷贝
	vector<int> v3(3,5);
	puts("n个elem拷贝:v3 :"); 
	for(auto x:v3) cout << x << " "; cout << endl;
	
	// 拷贝构造函数
	vector<int> v4(v2);
	puts("拷贝构造v4 :");
	for(auto x:v4) cout << x << " "; cout << endl;
	
	return 0; 
}

1) vector<int> V;

默认构造函数 vector<int> v;

2) vector(v.begin(),v.end())

将区间v.begin(),v.end(); 部分拷贝给本身。

vector<int> v2(v1.begin(), v2.end() ) 

vector<int> v2(v1.rbegin(),v2.rend() )

3) vector(n,elem)

将n个elem拷贝给本身

vector<int> v3(5,5) 

将5个5拷贝给v3本身

4) vector(const vector &v)

拷贝构造函数

vector<int> v4(v3) 

将v3拷贝给v4

迭代器(可以理解为指针)

vector<int>::iterator it = v.begin();

vector<int>::iterator it = v3.begin();
	cout << *it; 

4.vector的赋值操作 

代码

#include<bits/stdc++.h>
using namespace std;

int main () {
	// 重载赋值运算符
	vector<int> v(5,2);
	vector<int> v1 = v;
	puts("v :");
	for(auto x:v) cout << x << " "; puts("");
	puts("重载赋值运算符 = v1:");
	for(auto x:v1) cout << x << " "; puts("");
	//assign 区间赋值
	vector<int> v2(5,5);
	puts("v2 :");
	for(auto x:v2) cout << x << " "; puts("");
	v.assign(v2.begin(),v2.begin()+2);
	puts("v2区间赋值v :");
	for(auto x:v) cout << x << " "; puts("");
	//assign 赋值n个elem
	v.assign(1,5);
	puts("1个5, v:");
	for(auto x:v) cout << x << " "; puts("");
	 
	return 0; 
}

1.vector & operator = (const vector &v)

重载赋值运算符

v2 = v1

2.assign(v.begin(),v.end() )

assign 整片区间都会被覆盖掉

将区间v.begin(),v.end(),值赋值给本身

v3.assign(v1.begin(),v1.end())

3.assign(n,elem)

assign 整片区间都会被覆盖掉

v4.assign(5.9)

5.vector的容量和大小 

代码

#include<bits/stdc++.h>
using namespace std;

int main () {
	vector<int> v;
	puts("v.capacity()");
	cout << v.capacity() << endl;
	puts("v.empty()");
	cout << v.empty() << endl;
	puts("v.size() :");
	cout << v.size() << endl;
	
	puts("resize(5,1)后:");
	int n = 5; 
	v.resize(n,1);
	puts("v.capacity()");
	cout << v.capacity() << endl;
	puts("v.empty()");
	cout << v.empty() << endl;
	puts("v.size() :");
	cout << v.size() << endl;
	puts("输出v:");
	for(auto x:v) cout << x << " "; puts("");
	
	return 0; 
}

1.empty()

判断容器是否为空,为空返回1,否则返回0.

v1.empty();

2.capacity();

返回容器容量,如果size将会超过这个容量就需要重新分配新空间,恢复原数据增加新数据

v1.capacity();

3.size();

返回容器大小,即容器中元素个数

v1.size();

4.resize(int num);

重新指定容器的长度为num,

若容器变长,以默认值0填充新位置。

若容器变短,则末尾超过容器长度的元素被删除

v.resize(5);  int num = 4; v.resize(num);

5.resize(int num, int elem);

v.resize(5, 0)

与resize(int num)相同

resize动态扩展,大于容量,重新分配。

变长则以elem填充,

小于就仍旧使用原先空间,

相当于加水和倒水,杯子容量不够,换被子

6.vector的插入和删除

代码

 

#include<bits/stdc++.h>
using namespace std;

int main () {
	vector<int> v;
	puts("输入5个数字:");
	for(int i = 0; i < 5; i ++) {
		int x; cin >> x;
		v.push_back(x);
	} 
	puts("输出v:");
	for(auto x:v) cout << x << " "; puts("");
	
	puts("删除最后一个元素:并输出v:");
	v.pop_back();
	for(auto x:v) cout << x << " "; puts("");
	
	puts("在第一个位置插入 99 并输出v:");
	v.insert(v.begin(),99);
	for(auto x:v) cout << x << " "; puts(""); 
	
	puts("在最后一个位置插入3个20,并输出v:");
	v.insert(v.end(),3,20);
	for(auto x:v) cout << x << " "; puts(""); 
	
	puts("删除第二个元素,并输出v:");
	v.erase(v.begin()+1);
	for(auto x:v) cout << x << " "; puts("");
	
	puts("删除开头两个元素,并输出v:");
	v.erase(v.begin(),v.begin()+2);
	for(auto x:v) cout << x << " "; puts("");
	
	puts("清空容器,并输出v.empty():");
	cout << v.empty() << endl;
	
	return 0; 
}

1.push_back(ele);

尾部插入元素ele

v.push_back(ele);

2.pop_back();

删除最后一个元素

v.pop_back();

3.insert(const_iterator pos, ele);

在迭代器返回的位置pos处插入一个元素 ele

v.insert(v1.begin(),20);

4.insert(const_iterator pos, int count, ele);

在迭代器返回的位置pos处插入count个元素ele

v.insert(v1.end(),3,20);

5.erase(const_iterator pos)

删除迭代器指向的元素

v.erase(v.begin() );

6.erase(const_iterator begin, const_iterator end);

删除迭代器从begin到end的元素

v.erase(v.begin(),v.end() );

7.clear();

清空,删除容器中所有元素

v.clear()

7.vector互换容器

代码

#include<bits/stdc++.h>
using namespace std;

int main () {
	vector<int> v;
	puts("输入5个数字:");
	for(int i = 0; i < 5; i ++) {
		int x; cin >> x;
		v.push_back(x);
	} 
	vector<int> v1(5,2);
	puts("互换前,输出v和v1:");
	puts("v :");
	for(auto x:v) cout << x << " "; puts("");
	puts("v1:");
	for(auto x:v1) cout << x << " "; puts("");
	
	puts("互换后");
	v.swap(v1);
	puts("v :");
	for(auto x:v) cout << x << " "; puts("");
	puts("v1:");
	for(auto x:v1) cout << x << " "; puts("");
		
	return 0; 
}

1.swap(v)

容器v与当前容器互换

v1.swap(v)

8.vector 数据存取

代码

#include<bits/stdc++.h>
using namespace std;

int main () {
	vector<int> v;
	puts("输入5个数字:");
	for(int i = 0; i < 5; i ++) {
		int x; cin >> x;
		v.push_back(x);
	} 
	puts("输出v: ");
	for(auto x:v) cout << x << " "; puts("");
	
	int idx = 0;
	puts("v.at(idx)输出idx指向数据:");	
	cout << "idx:" << idx << " " << v.at(idx++) << endl;
	
	puts("operator[]索引所指向数据v[idx]: ");
	cout << "idx:" << idx << " " << v[idx++] << endl;
	
	puts("front()");
	cout << v.front() << endl;
	
	puts("back()");
	cout << v.back() << endl;
	return 0; 
}

1.at(int idx) 

返回索引idx所指的数据

v.at(i)

2.operator[]

返回[]内索所指数据

v[i]

3.front()

返回容器中第一个元素

v.front();

4.back()

返回容器中最后一个元素

v.back()

9.vector 预存空间 reserve

预存后里边是随机值,未预存不能取值

v2.reserve(1000)

代码 

#include<bits/stdc++.h>
using namespace std;

int main () {
	vector<int> v;
	puts("未预存前不能输出 v.back()");
	v.reserve(1000);
	puts("预存后,v.back()是一个随机值:");
	cout << v.back() << endl; 
	puts("v 容量:");
	cout << v.capacity() << endl;
	puts("");
	puts("构造时直接初始化1000个空间,默认值为0"); 
	vector<int> v1(1000);
	puts("vector<int> v1(1000) 的back值");
	cout << v1.back() << endl;
	puts("v1容量:");
	cout << v.capacity() << endl;
	puts("");
	puts("构造时直接初始化1000个空间为1");
	vector<int> v2(1000,1);
	puts("vector<int> v2(1000,1) 的back值");
	cout << v2.back() << endl;
	puts("v1容量:");
	cout << v.capacity() << endl;
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值