vector
1.头文件 #include<vector>
2.如何创建对象
vector<元素类型>变量名
vector<int> a;
vector<float> b;
vector<double> c;//只是单纯的定义变量a,b,c
vector<int>arr(10);//定义了10个整形元素的向量,但没有给出初始值,其值是不确定的
vector<int>st(10, 1);//定义了10个整形元素的向量,且每个元素的初始值都是1
vector<int>sq(st);//用st向量来创建sq向量,整体复制性赋值
int k[10] = { 1,2,3,4,5,6,7,8,9,10 };
vector<int>sp(k, k + 10);//从数组中获得初始值
for (int i = 0; i < sp.size(); i++)
cout << sp[i] << " ";//结果1 2 3 4 5 6 7 8 9 10
cout << endl;
for (int i = 0; i < st.size(); i++)
cout << st[i];
cout << endl;// 结果:1111111111
for (int i = 0; i < sq.size(); i++)
cout << sq[i];// 结果 1111111111
cout << endl;
3.vec.push_back(a);尾部插入元素
4.vec.pop_back();尾部删除元素
vector a;
for (int i = 0; i < 10; i++)
a.push_back(i);
for (int i = 0; i < 10; i++)
cout << a[i] << " ";//结果:0 1 2 3 4 5 6 7 8 9
cout << endl;
a.pop_back();//删除向量中最后一个元素
a.pop_back();
a.pop_back();
a.pop_back();
for (int i = 0; i < a.size(); i++)
cout << a[i] << " ";//结果:0 1 2 3 4 5
cout << endl;
5.插入元素: vec.insert(vec.begin()+i,a);在第i个元素后面插入a;
vector a;
for (int i = 0; i < 10; i++)
a.push_back(i);
for (int i = 0; i < 10; i++)
cout << a[i] << " ";//结果:0 1 2 3 4 5 6 7 8 9
cout << endl;
a.insert(a.begin() + 3, 99);
for (int i = 0; i < a.size(); i++)
cout << a[i] << " ";// 结果: 0 1 2 99 3 4 5 6 7 8 9
6.vec.erase(vec.begin()+i,vec.begin()+j);删除区间[i,j-1];区间从0开始
补充:a.erase(a.begin());//删除向量的第一个元素
a.erase(a.end() - 1);//删除向量的最后一个元素
a.erase(pos);//删除pos位置的元素
a.begin() 可以理解成向量中第一个元素的地址
a.end() 理解成向量中最后一个元素的地址的下一位
```cpp
vector<int> a;
for (int i = 0; i < 10; i++)
a.push_back(i);
for (int i = 0; i < 10; i++)
cout << a[i] << " ";//结果:0 1 2 3 4 5 6 7 8 9
cout << endl;
a.insert(a.begin() + 3, 99);
for (int i = 0; i < a.size(); i++)
cout << a[i] << " ";// 结果: 0 1 2 99 3 4 5 6 7 8 9
cout << endl;
a.erase(a.begin() + 2, a.begin() + 6)//删除的是下标2到5的元素(起始位置是0);
//a.erase(a.begin() + 2, a.end()-1);
for (int i = 0; i < a.size(); i++)
cout << a[i] << " ";//结果:0 1 5 6 7 8 9
cout << endl;
7.a.clear(); //清空a中的元素
8.a.empty(); //判断a是否为空,空则返回ture,不空则返回false
9.(20)a==b; //b为向量,向量的比较操作还有!=,>=,<=,>,<
比较的规则符合字典数排序
10.a.front():向量的第一个元素 a.back()向量的最后一个元素
## 常见库函数
1.**reverse**函数用于反转在[first,last)范围内的顺序(包括first指向的元素,不包括last指向的元素),reverse函数没有返回值
交换vector容器中元素的顺序
交换vector容器中元素的顺序(不能交换数组 和字符串)
```cpp
vector<int>a = { 1,2,3,4,5,6 };
for (int i = 0; i < a.size(); i++)
cout << a[i] << " ";//结果:1 2 3 4 5 6
cout << endl;
reverse(a.begin(), a.end());
for (int i = 0; i < a.size(); i++)
cout << a[i] << " ";// 结果:6 5 4 3 2 1
cout << endl;
string b = "abcdefg";
for (int i = 0; i < b.size(); i++)
cout << b[i] << " ";
cout << endl;
reverse(b.begin(), b.end());
for (int i = 0; i < b.size(); i++)
cout << b[i] << " ";
cout << endl;
2.unique 去重
该函数的作用是“去除”容器或者数组中相邻元素的重复出现的元素
(1) 这里的去除并非真正意义的erase,而是将重复的元素放到容器的末尾,返回值是去重之后的尾地址。
(2) unique针对的是相邻元素,所以对于顺序顺序错乱的数组成员,或者容器成员,需要先进行排序,可以调用sort()函数
vector<int>a = { 1,2,2,2,3,3,3,3,3,4,4,4,5,5,5,6,6,6 };
//vector<int>a = { 1,2,3,2,1,3,2,1,3,2,1,3,4,5,6,7,2 };这样去重是不可以的,因为没有排好序,这样的操作很有问题
for (int i = 0; i < a.size(); i++)
cout << a[i] << " ";//结果:1 2 2 2 3 3 3 3 3 4 4 4 5 5 5 6 6 6
cout << endl;
int sum = unique(a.begin(), a.end())-a.begin();//
//去重后的元素:1 2 3 4 5 6 3 3 3 4 4 4 5 5 5 6 6 6但此时返回的元素是
//6的下一个地址
for (int i = 0; i < sum; i++)
cout << a[i] << " ";//结果:1 2 3 4 5 6
cout << endl;
再看看去重数组
测试了一下无论是整形数组还是字符型数组还是浮点型数组,这个去重函数都是可以的
int a[] = { 1,2,2,2,2,3,3,3,4,4,4,4,5,5,5 };
int sz = sizeof(a) / sizeof(a[0]);
int sum = unique(a, a + sz)-a;
for (int i = 0; i < sum; i++)
cout << a[i] << " ";//结果:1 2 3 4 5
cout << endl;
char a[] = "aabbccddeeffgg";
int sz = strlen(a);
int sum = unique(a, a + sz ) - a;
for (int i = 0; i < sum; i++)
cout << a[i] << " ";//结果:a b c d e f g
cout << endl;
double a[] = { 1.1,2.2,2.2,3.3,3.3,5.5,5.5,6.6,6.6,7 };
int sz = sizeof(a) / sizeof(a[0]);
int sum = unique(a, a + sz)-a;
for (int i = 0; i < sum; i++)
cout << a[i] << " ";//结果:1.1 2.2 3.3 5.5 6.6
cout << endl;
3.sort函数
II)Sort函数有三个参数:
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
int com(int x, int y)
{
if (x > y)
return 1;
else
return 0;
}
int main()
{
int arr[] = { 2,332,32,323,32322,834,384 };
int sz = sizeof(arr) / sizeof(arr[0]);
sort(arr, arr + sz,com);
for (int i = 0; i < sz; i++)
cout << arr[i] << " ";//32322 834 384 332 323 32 2
cout << endl;
}