vector容器
vector数据结构和数组非常相似,也成为单端数组。
但vector又不同于普通数组,vector可以动态扩展
动态扩展并不是在原空间后接续新空间,而是找到更大的内存空间,然后将原数据拷贝到新空间,释放原空间。
创建vector容器
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;//默认构造
for (int i = 0; i < 10; i++)
{
v1.push_back(i);//在容器尾部加入数据
}
Print(v1);//0 1 2 3 4 5 6 7 8 9
vector<int>v2(v1.begin(), v1.end());//将v1.begin(), v1.end()之间的数据拷贝进v2;
Print(v2);//0 1 2 3 4 5 6 7 8 9
vector<int>v3(10, 1);
Print(v3);//1 1 1 1 1 1 1 1 1 1
vector<int> v4(v3);//拷贝构造
Print(v4);//1 1 1 1 1 1 1 1 1 1
return 0;
}
赋值
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;//默认构造
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
Print(v1);//0 1 2 3 4 5 6 7 8 9
vector<int>v2;
v2 = v1;//重载等号运算符
Print(v2);//0 1 2 3 4 5 6 7 8 9
vector<int >v3;
v3.assign(v1.begin(), v1.end());
Print(v3);//0 1 2 3 4 5 6 7 8 9
vector<int>v4;
v4.assign(10, 1);
Print(v4);//1 1 1 1 1 1 1 1 1 1
return 0;
}
常用重载等号运算符赋值。
vector的容量和大小操作
函数resize(int num),重新指定容器的长度为num,若容器变长,则以默认值填充新位置,默认值一般是0.如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num,elem) ,重新指定容器的长度为num,若容器变长,则以elem值填充新位置.如果容器变短,则末尾超出容器长度的元素被删除。
而且使用resize()函数后capacity()和size()两者返回值相同。
对vector容器进行插入,删除操作
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;//默认构造
for (int i = 0; i < 10; i++)
{
v1.push_back(i);//尾部插入元素
}
Print(v1);//0 1 2 3 4 5 6 7 8 9
v1.pop_back();//删除最后一个元素
Print(v1);//0 1 2 3 4 5 6 7 8
v1.insert(v1.end(), 9);//迭代器指向位置插入元素
Print(v1);//0 1 2 3 4 5 6 7 8 9
v1.insert(v1.begin(), 2, 3);//迭代器指定位置插入2个3;
Print(v1);
v1.erase(v1.begin());//删除迭代器指定元素
Print(v1);//3 0 1 2 3 4 5 6 7 8 9
vector<int>::iterator it = v1.begin();
it += 2;//vector容器和数组相似可以跳跃式访问
v1.erase(v1.begin(),it );//删除两个迭代器之间的元素
Print(v1);//1 2 3 4 5 6 7 8 9
v1.clear();//清空容器
if (v1.empty())
{
cout << "v1为空" << endl;
}
return 0;
}
vector中的数据存取操作
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;//默认构造
for (int i = 0; i < 10; i++)
{
v1.push_back(i);//尾部插入元素
}
Print(v1);//0 1 2 3 4 5 6 7 8 9
//vector容器的所储存元素的下标从零开始;
cout << v1.at(3) << endl;//3
cout << v1[3] << endl;//3
cout << v1.front() << endl;//0,返回容器中第一个数据元素
cout << v1.back() << endl;//9,返回容器最后一个数据元素
return 0;
}
vector互换元素
void Print(vector<int>& v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
cout << "交换前:" << endl;
vector<int> v1;//默认构造
for (int i = 0; i < 10; i++)
{
v1.push_back(i);//尾部插入元素
}
Print(v1);//0 1 2 3 4 5 6 7 8 9
vector<int >v2;
for (int i = 9; i >= 0; i--)
{
v2.push_back(i);
}
Print(v2);
cout << "交换后:" << endl;
v1.swap(v2);
Print(v1);
Print(v2);
return 0;
}
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;//默认构造
for (int i = 0; i < 1000; i++)
{
v1.push_back(i);//尾部插入元素
}
cout << "v1的大小为:" << v1.capacity() << endl;//v1的大小为:1066
cout << "v1中的元素个数为:" << v1.size() << endl;//v1中的元素个数为:1000
vector<int>(v1).swap(v1);
cout << "操作后\n";
cout << "v1的大小为:" << v1.capacity() << endl;//v1的大小为:1000
cout << "v1中的元素个数为:" << v1.size() << endl;//v1中的元素个数为:1000
return 0;
}
vector<int>(v1).swap(v1);拷贝构造一个匿名容器,与v1进行于交换
此步骤可缩减容器大小,减少空间的浪费。
vector预留空间
减少vector动态扩展的次数
函数reserve(int len)容器预留len个元素长度,预留位置不初始化,元素不可访问
区分resize()和reserve()的区别
英语单词reserve:保留,预定