vector<int> vec;
vec.push_back(10);
for_each(vec.begin(), vec.end(),myPrint);
vector<int>::iterator itBegin = vec.begin(); //vec.begin() 指向容器中第一个元素的位置
vector<int>::iterator itEnd = vec.end(); //vec.end() 指向容器中最后一个元素的,下一个位置
//第 2 种遍历vector容器元素的方法
while (itBegin != itEnd)
{
cout << *itBegin << " ";
itBegin++;
}
//第 2 种遍历vector容器元素的方法
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
{
cout << *it << " ";
}
//第 3 种遍历vector容器元素的方法
for_each(vec.begin(), vec.end(),myPrint); //myPrint,回调函数
cout << endl;
1、vector存放内置数据类型
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
void myPrint(int val)
{
cout << val << " ";
}
void test01()
{
//创建vector容器
vector<int> vec;
//向vector中插入元素
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
vec.push_back(23);
//vector容器迭代器
vector<int>::iterator itBegin = vec.begin(); //vec.begin() 指向容器中第一个元素的位置
vector<int>::iterator itEnd = vec.end(); //vec.end() 指向容器中最后一个元素的,下一个位置
//第 1 种遍历vector容器元素的方法
while (itBegin != itEnd)
{
cout << *itBegin << " ";
itBegin++;
}
cout << endl;
//第 2 种遍历vector容器元素的方法
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
{
cout << *it << " ";
}
cout << endl;
//第 3 种遍历vector容器元素的方法
for_each(vec.begin(), vec.end(),myPrint); //myPrint,回调函数
cout << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
2、vector存放自定义数据类型
#include<iostream>
using namespace std;
#include<string>
#include<vector>
class Person
{
public:
Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
public:
string m_Name;
int m_Age;
};
void test01()
{
//1.vector存放对象
vector<Person> vec;
Person p1("Ton", 19);
Person p2("Saili", 22);
Person p3("Yoyo", 20);
vec.push_back(p1);
vec.push_back(p2);
vec.push_back(p3);
for (vector<Person>::iterator it = vec.begin(); it != vec.end(); it++)
{
//cout << "name:" << (*it).m_Name << "\tage:" << (*it).m_Age << endl;
cout << "name:" << it->m_Name << "\tage:" << it->m_Age << endl;
}
}
void test02()
{
//2.vector存放对象指针
vector<Person*> vec;
Person p1("Ton", 19);
Person p2("Saili", 22);
Person p3("Yoyo", 20);
vec.push_back(&p1);
vec.push_back(&p2);
vec.push_back(&p3);
for (vector<Person*>::iterator it = vec.begin(); it != vec.end(); it++)
{
cout << "name:" << (*it)->m_Name << "\tage:" << (*it)->m_Age << endl;
cout << "name:" << << "\tage:" << (*it)->m_Age << endl;
}
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}
3、vector容器嵌套容器
#include<iostream>
using namespace std;
#include<vector>
void test01()
{
vector<vector<int>> vec;
vector<int> v1;
vector<int> v2;
vector<int> v3;
vector<int> v4;
//里面的小容器先赋值,再插入大容器。否则啥也没有
for (int i = 0; i < 4; i++)
{
v1.push_back(i);
v2.push_back(i + 1);
v3.push_back(i + 2);
v4.push_back(i + 3);
}
vec.push_back(v1);
vec.push_back(v2);
vec.push_back(v3);
vec.push_back(v4);
//先说明是什么类型的容器迭代器,再使迭代器指向某个特定容器的位置
for (vector<vector<int>>::iterator it = vec.begin(); it != vec.end(); it++)
{
//(*it)----vector<int>
for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++)
{
//(*vit)----int
cout << *vit << " ";
}
cout << endl;
}
}
int main()
{
test01();
system("pause");
return 0;
}
vector:单端数组,动态扩展
动态扩展:并不是在原有空间之下接新空间,
而是找更大的空间,然后将原数据拷贝到新空间,释放原空间。
vector的迭代器支持随机访问
01、vector构造函数
#include<iostream>
using namespace std;
#include<vector>
void printVector(vector<int>& vec)
{
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
//1.默认构造,无参构造
vector<int>vec1;
for (int i = 0; i < 10; i++)
{
vec1.push_back(i);
}
printVector(vec1);
//2.通过区间的方式进行构造
vector<int>vec2(vec1.begin(), vec1.end());
printVector(vec2);
//3.通过n个elem方式构造
vector<int>vec3(5, 999); //5 个 999
printVector(vec3);
//4.拷贝构造
vector<int>vec4(vec3);
printVector(vec4);
}
int main()
{
test01();
system("pause");
return 0;
}
02、vector容器的赋值操作
#include<iostream>
using namespace std;
#include<vector>
//vector容器的赋值
void printVector(vector<int>& vec)
{
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector<int>vec1;
//1.赋值,push_back()
for (int i = 0; i < 10; i++)
{
vec1.push_back(i);
}
printVector(vec1);
//2.赋值方式,operator=()
vector<int>vec2;
vec2 = vec1;
printVector(vec2);
//3.assign赋值
vector<int>vec3;
vec3.assign(vec2.begin(), vec2.end());
printVector(vec3);
//4.n个elem的赋值,assign(n,elem)
vector<int>vec4;
vec4.assign(4, 877); //4个877
printVector(vec4);
}
int main()
{
test01();
system("pause");
return 0;
}
03、vector容器--容量和大小
vec.empty() //判断容器是否为空
vec.capacity() //容器容量
vec.size() //容器中元素个数
vec.resize(int num) //重新指定容器大小,num个(默认赋值0)
vec.resize(int num, elem) //重新指定容器大小,num个(赋值为 elem)
#include<iostream>
using namespace std;
#include<vector>
//vector容器的容量和大小
void printVector(vector<int>& vec)
{
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
//1.
vector<int>vec1;
for (int i = 0; i < 10; i++)
{
vec1.push_back(i);
}
printVector(vec1);
//2.
if (vec1.empty())
{
cout << "vec1为空!" << endl;
}
else
{
cout << "vect1不为空!" << endl;
cout << "vec1的容量:" << vec1.capacity() << endl;
cout << "vec1的大小:" << vec1.size() << endl;
}
//3.
vec1.resize(14);
printVector(vec1);
cout << "vec1的容量:" << vec1.capacity() << endl;
cout << "vec1的大小:" << vec1.size() << endl;
//4.
vec1.resize(18, 999);
printVector(vec1);
cout << "vec1的容量:" << vec1.capacity() << endl;
cout << "vec1的大小:" << vec1.size() << endl;
//5.
vec1.resize(5);
printVector(vec1);
cout << "vec1的容量:" << vec1.capacity() << endl;
cout << "vec1的大小:" << vec1.size() << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
04、vector插入删除
push_back(elem) //插入
pop_back() //删除
insert(const_iterator pos, elem) //指定位置插入
intsert(const_iterator pos, int num, elem) //
erase(const_iterator pos) //指定位置删除
erase(const_iterator start, const_iterator end) //
clear() //清空
#include<iostream>
using namespace std;
#include<vector>
//vector插入和删除
void printVector(vector<int>& vec)
{
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
vector<int>vec;
//尾插
for (int i = 1; i < 10; i++)
{
vec.push_back(i * 10);
}
vector<int>vec1(vec.begin(), vec.end());
printVector(vec);
//尾删
vec.pop_back();
printVector(vec);
//insert,插入一个数
vec.insert(vec.begin(), 999);
printVector(vec);
//insert,插入3个数
vec.insert(vec.begin(),3, 888);
printVector(vec);
//insert,指定位置插入数
vector<int>::iterator it = vec.begin();
it++;
vec.insert(it, 444);
//vec.insert(it, 2, 444);
printVector(vec);
//erase,删除一个元素
vec.erase(vec.begin());
printVector(vec);
//erase,删除一个区间里的元素
vec.erase(vec.begin(), vec.end());
printVector(vec);
//清空
cout << "清空" << endl;
printVector(vec1);
vec1.clear();
printVector(vec1);
}
int main()
{
test01();
system("pause");
return 0;
}
05、vector数据存取
vec.at(int index) //
vec[ i ] //
vec.front() //返回容器中第一个数据元素
vec.back() //返回容器中最后一个数据元素
#include<iostream>
using namespace std;
#include<vector>
//vector数据存取
void test01()
{
vector<int>vec;
for (int i = 1; i < 10; i++)
{
vec.push_back(i * 10);
}
//利用vec[i]方式访问元素
for (int i = 0; i < vec.size(); i++)
{
cout << vec[i] << " ";
}
cout << endl;
//利用vec.at(i)方式访问
for (int i = 0; i < vec.size(); i++)
{
cout << vec.at(i) << " ";
}
cout << endl;
cout << "vec的第一个元素:" << vec.front() << endl;
cout << "vec的最后一个元素;" << vec.back() << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
06、vector互换元素
vec.swap(vec1) //
1、巧用swap可以收缩内存空间
vector<int>(vec).swap(vec)
vector<int>(v) 匿名对象
vec 和匿名对象交换大小,匿名对象指向了大的内存,
vec指向了匿名对象创建的小空间,
之后,匿名对象被回收
#include<iostream>
using namespace std;
#include<vector>
//vector容器的互换
void printVector(vector<int>& vec)
{
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//1.基本使用
void test01()
{
//第1个容器
vector<int>vec1;
for (int i = 1; i < 10; i++)
{
vec1.push_back(i);
}
printVector(vec1);
//第2个容器
vector<int>vec2;
for (int i = 9; i > 0; i--)
{
vec2.push_back(i);
}
printVector(vec2);
//交换后
cout << "交换后" << endl;
vec1.swap(vec2);
printVector(vec1);
printVector(vec2);
}
//2.实际用途
//巧用swap可以收缩内存空间
void test02()
{
vector<int>vec;
for (int i = 0; i < 10000; i++)
{
vec.push_back(i);
}
cout << "vec的容量:" << vec.capacity() << endl;
cout << "vec的大小:" << vec.size() << endl;
//重新指定大小,容量未减少
vec.resize(5);
cout << "vec的容量:" << vec.capacity() << endl;
cout << "vec的大小:" << vec.size() << endl;
//交换,收缩内存
vector<int>(vec).swap(vec);
cout << "vec的容量:" << vec.capacity() << endl;
cout << "vec的大小:" << vec.size() << endl;
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}
07、vector预留空间
#include<iostream>
using namespace std;
#include<vector>
//vector预留空间
void test01()
{
vector<int>vec;
vec.reserve(100000); //使用reserve之后,num=0 ,直接预留了,不至于后边扩展了30次内存
//统计开辟了多少次内存
int num = 0;
int* p = NULL;
for (int i = 0; i < 100000; i++)
{
vec.push_back(i);
if (p != &vec[0])
{
p = &vec[0];
num++;
}
}
cout << "num = " << num << endl; //未使用reserve时,num=30,(重新找内存就找了30次)
//使用了reserve之后,num=0
}
int main()
{
test01();
system("pause");
return 0;
}