vector基本概念
普通数组时静态空间,而vector可以动态扩展,但是vector的动态扩展并不是在存储空间后面添加存储位置,而是寻找新的更大的存储位置,然后将原空间中的所有的数据复制到新的存储位置里。
vector中常用的迭代器:begin指向第一个,end指向最后一个的下一个
,rbegin指向最后一个,rend指向第一个的前一个,vecotr迭代器比较强悍,不需要连续的访问方式,支持随机访问
//vector的构造方式
/*
vector v;//采用默认构造函数
vector(v.begin(),v.end());//将v.begin()到v.end()中的元素拷贝给本身,前闭后开
vector(n,elem);//构造函数将n个elem拷贝给本身
vector(const vector&vec);//采用拷贝构造函数
*/
#include<iostream>
#include<string>
#include<vector>
using namespace std;
/*
void print(vector<int> V)
{
for (vector<int>::iterator it = V.begin();it != V.end();it++)
cout << *it << " ";
cout << endl;
}
int main()
{
vector<int> V;
for (int i = 0;i < 10;i++)
V.push_back(i);
print(V);
vector<int> v(V.begin(), V.end());
print(v);
vector<int> v1(10, 10);
print(v1);
vector<int> v2(v1);
print(v2);
system("pause");
}
*/
/*
vector容器的赋值
vector operator=(const vector&v)//将v中的值赋值给目标
assign(v.begin,v.end)//将[v.begin,v.end)中的数据传递给对象
assign(n,elem)//将n个elem传递给对象
*/
/*
void print(vector<int>&v)
{
for (vector<int>::iterator it=v.begin();it != v.end();it++)
cout << *it << " ";
cout << endl;
}
int main()
{
vector<int> v;
for (int i = 0;i < 10;i++)
v.push_back(i);
vector<int> v1 = v;
vector<int> v2;
v2.assign(v1.begin(), v1.end());
//print(v2);
vector<int> v3;
v3.assign(10, 1);
print(v3);
system("pause");
}
*/
//vector容器的的容量和大小操作
//empty用来检测容器是否为空
//capacity用来检测容器的容量
//size用来检测容器中数据数量
//resize用来重新指定容器长度,如果长度大于原来的长度那么使用0来填充,如果比原来短了那么会删除超出部分
//注意resize指定的是size而不是capacity
/*
void print(vector<int>&v)
{
for (vector<int>::iterator it = v.begin();it != v.end();it++)
cout << *it << " ";
cout << endl;
}
int main()
{
vector<int> v;
for (int i = 0;i < 10;i++)
v.push_back(i);
print(v);
cout << v.empty() << endl;
cout << v.capacity() << endl;
cout << v.size() << endl;
v.resize(15);
cout << v.capacity() << endl;
cout << v.size() << endl;
print(v);
system("pause");
}
*/
//vector的插入和删除
/*
push_back(ele)在尾部插入数据
pop_back()删除最后一个元素
insert(const_iterator pos,int ele)迭代器指向位置插入ele
insert(const_iterator pos,int cout,ele)迭代器指向位置pos插入cout个元素ele
erase(const_iterator pos)删除pos指向位置元素
erase(const_iterator start,const_iterator end);删除迭代器start到end之间的元素,注意是[start,end);
*/
/*
void print(vector<int>&v)
{
for (vector<int>::iterator it = v.begin();it != v.end();it++)
cout << *it << " ";
cout << endl;
}
int main()
{
vector<int> v;
for (int i = 0;i < 10;i++)
v.push_back(i);
print(v);
v.pop_back();
print(v);
v.insert(v.begin(), 100);
print(v);
v.insert(v.begin(), 2, 100);
print(v);
v.erase(v.begin());
print(v);
v.erase(v.begin(), v.begin() + 2);
print(v);
system("pause");
}
*/
//vector容器的存取
/*
[idx]返回idx所指向的数据
at(int idx)返回idx所指的数据
front返回容器中的第一个数据,这里返回的是数据begin返回的是迭代器
back返回容器中的最后一个数据,这里返回的数据,end()返回的是迭代器
*/
/*
void print(vector<int>&v)
{
for (vector<int>::iterator it = v.begin();it != v.end();it++)
cout << *it << " ";
cout << endl;
}
int main()
{
vector<int> v;
for (int i = 0;i < 10;i++)
v.push_back(i);
for (int i = 0;i < 10;i++)
cout << v[i] << " ";
cout << endl;
for (int i = 0;i < 10;i++)
cout << v.at(i) << " ";
cout << endl;
cout << v.front() << endl;
cout << v.back() << endl;
getchar();
}
*/
//vector互换容器
/*
swap(vectorv)将自身内容与v中内容进行互换,可以借助swap实现内存的合理化
当v容器扩大以后,如果使用resize来减少其尺寸,那么v的capacity是不会改变的,
但是可以通过vector(v).swap(v)的方式来使得capacity减小到和size一样大小
*/
/*
void print(vector<int>&v)
{
for (vector<int>::iterator it = v.begin();it != v.end();it++)
cout << *it << " ";
cout << endl;
}
int main()
{
vector<int> v1;
vector<int> v2;
for (int i = 0;i < 10;i++)
{
v1.push_back(i);
v2.push_back(i + 10);
}
print(v1);
print(v2);
v1.swap(v2);
print(v1);
print(v2);
for (int i = 0;i < 10000;i++)
v1.push_back(i);
cout << v1.capacity() << endl;
cout << v1.size() << endl;
v1.resize(3);
cout << v1.capacity() << endl;
cout << v1.size() << endl;
vector<int>(v1).swap(v1);
cout << v1.capacity();
getchar();
}
*/
//vector预留空间
//reserve(int len)预留len个空间,但是该空间均未初始化,不可以访问,下面程序中的n统计了在v的扩充过程中一共扩展了多少次内存
//可以发现不使用reserve的话,需要扩展很多次,很浪费时间
int main()
{
vector<int> v;
int*p = NULL;
int n = 0;
for (int i = 0;i < 10000;i++)
{
v.push_back(i);
if (p != &v[0])
{
p = &v[0];
n++;
}
}
cout << n << endl;
getchar();
}