vector学习笔记
这里我也是看了许多讲解vector的博客才来写下我自己的认识,主要是关于简单概念和操作的内容,至于具体的内部实现,此处不涉及。有错误请批评指出,谢谢!
写在前面:
向量(vector 容器类):#include <vector>,vector 是一种动态数组,是基本数组的类模板。其内部定义了很多基本操作。
建立vector容器印象:
动态增长:插入新元素,如果原有的空间不足时,自动重新申请更大的空间(默认两倍),将圆数据拷贝到新空间,再进行添加数据操作
单口容器:在数据中间插入的方法效率低,故使用较少,大多尾插
-
几种常用的初始化和遍历
/*1-vector*/
#include <iostream>
#include <vector>
#include <iterator>//用到几种迭代器
#include <numeric>
using namespace std;
int main (void){
vector<int> v;
for(int i = 0; i < 10; ++i){
v.push_back(i);
}
//下标遍历:
for(int i = 0; i < v.size(); ++i){
cout << v[i] << " ";
}
cout << endl;
//迭代器遍历:
for(vector<int>::iterator it = v.begin(); it != v.end(); ++it){
cout << *it << " ";
}
cout << endl;
//copy()函数遍历:
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
cout << endl;
//累加
int sum = 0;
sum = accumulate(v.begin(), v.end(), 0);
cout << sum << endl;
return 0;
}
这里复制操作还有一个用assign()的,写在后文中了。
-
关于操作函数
既然这是一个类,那么它就会有 自己的构造函数,上面的初始化和遍历中就用到了一些函数:
v.begin() , v.end() , v.size() , v.push_back()。
合集:
1.push_back() 在数组的最后添加一个数据
2.pop_back() 去掉数组的最后一个数据
3.at() 得到编号位置的数据
4.begin() 得到数组头的指针
5.end() 得到数组的最后一个单元+1的指针
6.front() 得到数组头的引用
7.back() 得到数组的最后一个单元的引用
8.max_size() 得到vector最大可以是多大
9.capacity() 当前vector分配的大小
10.size() 当前使用数据的大小
11.resize() 改变当前使用数据的大小,如果它比当前使用的大,则填充默认值
12.reserve() 改变当前vecotr所分配空间的大小
13.erase() 删除指针指向的数据项
14.clear() 清空当前的vector
15.rbegin() 将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend() 将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty() 判断vector是否为空
18.swap() 与另一个vector交换数据
19.assign() 赋值
-
例程:
其中包含v.begin(), v.end(), v.push_back(), v.size(), v.pop_back(), v.front(), v.back(), v.at(), v.empty(), v.erase(), v.clear(), v.assign(), v.insert()等。。。当然还有很多其他的函数,但我感觉不太常用。
/*vector-2*/
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>//用到几种迭代器
using namespace std;
void print(vector <int> v){
cout << "大小为: " << v.size() << endl;
for(int i = 0; i < v.size(); ++i){
cout << v[i] << ' ';
}
cout << endl << "---------------------" << endl;
}
/*自定义排序
bool mycmp(const int &a, const int &b){
return a > b;
}
*/
int main(void){
vector <int> v1;
cout << "v1: " << endl;
print(v1);
/*
v1:
大小为: 0
---------------------
*/
vector <int> v2(5);
cout << "v2: " << endl;
print(v2);
/*
v2:
大小为: 5
0 0 0 0 0
---------------------
*/
vector <int> v3(5, 5);
cout << "v3: " << endl;
print(v3);
/*
v3:
大小为: 5
5 5 5 5 5
---------------------
*/
//使用push_back方法尾部插入元素
v1.push_back(1); //v1尾部插入1
cout << "v1: " << endl;
print(v1);
v3.push_back(3); //v3尾部插入3
cout << "v3: " << endl;
print(v3);
/*
v1:
大小为: 1
1
---------------------
v3:
大小为: 6
5 5 5 5 5 3
---------------------
*/
//使用pop_back删除尾元素
v1.pop_back();
cout << "v1: " << endl;
print(v1);
/*
v1:
大小为: 0
---------------------
*/
//使用insert方法插入元素
v2.insert(v2.begin(), 1); //在v2首部插入1
v2.insert(v2.end(), 2); //在v2尾部插入2
v2.insert(v2.begin() + 2, 1); //在v2第二个元素后插入3
v2.insert(v2.end() - 2, 2); //在v2倒数第二个元素前插入2
cout << "v2: " << endl;
print(v2);
/*
v2:
大小为: 9
1 0 1 0 0 0 2 0 2
---------------------
*/
//重新赋值
for(int i = 0; i < v3.size(); ++i){
v3[i] = i;
}
cout << "v3: " << endl;
print(v3);
/*
v3:
大小为: 6
0 1 2 3 4 5
---------------------
*/
//使用erase方法删除元素
cout << "v3: " << endl;
v3.erase(v3.begin() + 1); //删除第一个元素
print(v3);
v3.erase(v3.begin() + 2, v3.begin() + 4);//从第二个元素一直删到第四个元素
print(v3);
/*
v3:
大小为: 5
0 2 3 4 5
---------------------
大小为: 3
0 2 5
---------------------
*/
//使用clear方法清空容器
v3.clear();
if(v3.empty())
cout << "v3: 已清空" << endl;
print(v3);
/*
v3: 已清空
大小为: 0
---------------------
*/
//使用assign方法重新赋值
v3.assign(7, 3);
cout << "v3: " << endl;
print(v3);
/*
v3:
大小为: 7
3 3 3 3 3 3 3
---------------------
*/
//使用reverse()方法反向排列, 添加algorithm头文件
cout << "v2: " << endl;
for(int i = 0; i < v2.size(); ++i){
v2[i] = i;
}
print(v2);
reverse(v2.begin(), v2.end()); //全部反向
print(v2);
reverse(v2.begin()+2, v2.begin()+5);//部分反向
print(v2);
/*
v2:
大小为: 9
0 1 2 3 4 5 6 7 8
---------------------
大小为: 9
8 7 6 5 4 3 2 1 0
---------------------
大小为: 9
8 7 4 5 6 3 2 1 0
---------------------
*/
//使用front方法查看首元素
cout << "v2.front() = " << v2.front() << endl;
//使用back方法查看尾元素
cout << "v2.back() = " << v2.back() << endl;
//使用at方法查看某个元素
cout << "v2.at() = " << v2.at(4) << endl;
/*
v2.front() = 8
v2.back() = 0
v2.at() = 6
*/
return 0;
}
有新的用法在更新。。。