vector是表示可变大小数组的序列容器。
1.vector定义(构造)
void vector6()
{
// constructors used in the same order as described above:
vector<int> first; // 构造空vector对象
vector<int> second(4, 100); // 进行构造同时进行初始化 这里生成的对象会有4个100的元素
vector<int> third(second.begin(), second.end()); // 这里是使用second对象的迭代器进行初始化
vector<int> fourth(third); // 拷贝构造
int myints[] = { 16,2,77,29 };
std::vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));
}
int main()
{
vector<int>v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(1);
v1.push_back(5);
v1.push_back(6);
v1.push_back(1);
return 0;
}
vector容器的定义和尾插数据
vector容器的遍历
通过重载[]进行访问
int main()
{
vector<int>v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(1);
v1.push_back(5);
v1.push_back(6);
v1.push_back(1);
for (size_t i = 0 ; i < v1.size();i++)
{
cout << v1[i] << " ";
}
cout << endl;
return 0;
}
vector容器可以储存很多类型
void vector1()
{
vector<int> v1;
vector<double> v1;
vector<char> v1;
vector<vector<int>> v1;
vector<string> v1;
}
那么vector<char>和string的区别是什么 是否vector<char>能否代替string呢
是不能的 string既可以插入字符也可以插入字符串 而vector<char>只能插入字符无法插入字符串
string和vector<char>的底层非常相似 但是接口不同 如append +=这样的接口vector是没有的
string是专门针对字符串数组设计的 而vector是根据所有类型设计的 两者不相同
不能替代
vector使用迭代器进行变量
void vector2()
{
vector<int>v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(1);
v1.push_back(5);
v1.push_back(6);
v1.push_back(1);
/*for (size_t i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;*/
vector<int>::iterator e = v1.begin();
while (e!=v1.end())
{
cout << *e << " ";
e++;
}
cout << endl;
}
使用范围for对vector进行遍历
void vector2()
{
vector<int>v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(1);
v1.push_back(5);
v1.push_back(6);
v1.push_back(1);
/*for (size_t i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;*/
/*vector<int>::iterator e = v1.begin();
while (e!=v1.end())
{
cout << *e << " ";
e++;
}
cout << endl;*/
for (auto e : v1)
{
cout << e << " ";
}
cout << endl;
}
void vector3()
{
vector<string>v1;
string s1("张三");
v1.push_back(s1);//有名对象
v1.push_back(string("呵呵"));//匿名对象
v1.push_back("哈哈");//隐式类型转换 这里有问题
for (const auto & e : v1)//string类型的vector遍历这里可以修改一下
{
cout << e << " ";
}
cout << endl;
}
这里的范围for遍历 相当于e = *it 每次都进行一次深拷贝 如果加上引用那么就会减少很多损耗 如果不修改还可以再前面加上const
vector的begin是指向数组的第一个元素 而end是指向数组最后一个元素的下一个
对vector进行排序 可以使用sort (算法配合vector进行使用)
sort是存在algorithm库中的 它是一个函数模版 它的参数传的是函数的迭代器
void vector4()
{
vector<int>v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(12);
v1.push_back(5);
v1.push_back(6);
v1.push_back(10);
v1.push_back(100);
v1.push_back(19);
v1.push_back(41);
v1.push_back(55);
v1.push_back(7);
sort(v1.begin(),v1.end());
for (auto e:v1)
{
cout << e << " ";
}
cout << endl;
}
如果是想要跳开第一个和最后一个进行排序则要调整sort中的参数
void vector4()
{
vector<int>v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(12);
v1.push_back(5);
v1.push_back(6);
v1.push_back(10);
v1.push_back(100);
v1.push_back(19);
v1.push_back(41);
v1.push_back(55);
v1.push_back(7);
sort(v1.begin()+1,v1.end()-1);
for (auto e:v1)
{
cout << e << " ";
}
cout << endl;
}
void vector4()
{
vector<int>v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(12);
v1.push_back(5);
v1.push_back(6);
v1.push_back(10);
v1.push_back(100);
v1.push_back(19);
v1.push_back(41);
v1.push_back(55);
v1.push_back(7);
//sort(v1.begin(),v1.end());
//sort(v1.begin()+1,v1.end()-1);
sort(v1.begin(),v1.begin()+v1.size()/2);//这里根据改变参数来改变排序范围 非常灵活
for (auto e:v1)
{
cout << e << " ";
}
cout << endl;
}
这里的排序都是升序(默认) 那么该如何进行降序比较呢
可以将greater仿函数作为sort的第三个参数来改变sort的升序变为降序
void vector4()
{
vector<int>v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(12);
v1.push_back(5);
v1.push_back(6);
v1.push_back(10);
v1.push_back(100);
v1.push_back(19);
v1.push_back(41);
v1.push_back(55);
v1.push_back(7);
greater<int>gt;//仿函数
sort(v1.begin(),v1.end(),gt);
//sort(v1.begin()+1,v1.end()-1);
//greater<int>gt;//仿函数
//sort(v1.begin(),v1.begin()+v1.size()/2,gt);//这里根据改变参数来改变排序范围 非常灵活
for (auto e:v1)
{
cout << e << " ";
}
cout << endl;
}
void vector5()
{
greater<int> gt;//这个仿函数是这个类型的对象 可以支持比较大小
cout<<gt(3,2)<<endl;
cout<< gt(2,3)<<endl;
}
除了greater之外还有less也是仿函数
为什么仿函数的这个对象能够像函数一样去调用?
void vector5()
{
greater<int> gt;//这个仿函数是这个类型的对象 可以支持比较大小
cout<<gt(3,2)<<endl;
cout << gt.operator()(3, 2) << endl;//为什么这个对象能够像函数一样去调用的本质
cout<< gt(2,3)<<endl;
}
size 和 capacity 可以查看当前vector 的有效数组大小 和总的空间大小
empty可以判断容器是否为空
如果 n 小于当前容器大小,则内容将减少到其前 n 个元素,删除超出此部分的元素(并销毁它们)。
如果 n 大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,以达到 n 的大小。如果指定了 val ,则新元素将初始化为 val 的副本,否则,它们将进行值初始化。
如果 n 也大于当前容器容量,则会自动重新分配分配的存储空间。
void vector7()
{
std::vector<int> myvector;
// set some initial content:
for (int i = 1; i < 10; i++) myvector.push_back(i);
myvector.resize(5);
myvector.resize(8, 100);
myvector.resize(12);
std::cout << "myvector contains:";
for (int i = 0; i < myvector.size(); i++)
std::cout << ' ' << myvector[i];
std::cout << '\n';
}
reserve可以改变容器的空间大小
请求容量至少足以包含 n 个元素。
如果 n 大于当前容量,则该函数会导致容器重新分配其存储,将其容量增加到 n(或更大)。
在所有其他情况下,函数调用不会导致重新分配,并且容量不受影响。
void vector8()
{
vector<int>v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(1);
v1.push_back(5);
v1.push_back(6);
v1.push_back(1);
/*for (size_t i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;*/
/*vector<int>::iterator e = v1.begin();
while (e!=v1.end())
{
cout << *e << " ";
e++;
}
cout << endl;*/
for (auto e : v1)
{
cout << e << " ";
}
cout << endl;
v1.pop_back();
v1.pop_back();
v1.pop_back();
for (auto e : v1)
{
cout << e << " ";
}
cout << endl;
}
从容器中删除单个元素 (位置) 或一系列元素 ([first,last))
void vector9()
{
vector<int>v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(1);
v1.push_back(5);
v1.push_back(6);
v1.push_back(1);
for (auto e : v1)
{
cout << e << " ";
}
cout << endl;
v1.insert(v1.begin(), 5); //插入一个数据
for (auto e : v1)
{
cout << e << " ";
}
cout << endl;
v1.insert(v1.begin(), 5,100);//填充
for (auto e : v1)
{
cout << e << " ";
}
cout << endl;
vector<int> vv;
vv.insert(vv.begin(),v1.begin(),v1.end());//范围插入
for (auto e : vv)
{
cout << e << " ";
}
cout << endl;
}
用 x 的内容交换容器的内容,x 是另一个相同类型的矢量对象。大小可能有所不同。
调用此成员函数后,此容器中的元素是调用之前位于 x 中的元素,而 x 的元素是 this 中的元素。所有迭代器、引用和指针对于交换的对象仍然有效
这个是算法模块实现,不是vector的成员接口
一共有三个参数 第一个和第二个表示查找范围 第三个表示要查找的值 若是能找到则返回对应位置的值
void vector10()
{
int myints[] = { 10, 20, 30, 40 };
int* p;
p = std::find(myints, myints + 4, 30);
if (p != myints + 4)
std::cout << "Element found in myints: " << *p << '\n';
else
std::cout << "Element not found in myints\n";
// using std::find with vector and iterator:
std::vector<int> myvector(myints, myints + 4);
std::vector<int>::iterator it;
it = find(myvector.begin(), myvector.end(), 30);
if (it != myvector.end())
std::cout << "Element found in myvector: " << *it << '\n';
else
std::cout << "Element not found in myvector\n";
}
这里数组使用指针确定范围 同时返回的是对应位置的指针
而vector容器是通过迭代器确定范围 返回的也是对应位置的迭代器
如果没找到 就会返回到查找范围的最后一个元素的位置
查找的范围应该设置左闭右开 即右边应该是有效元素的下一个位置作为边界