参考文章
https://www.cnblogs.com/mr-wid/archive/2013/01/22/2871105.html
vector
c++ primer的作者说到,在实际的编程中,我们作为程序员应该避免用到低级数组和指针,而更应该多用高级的vector和迭代器
简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。线性连续空间
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//自定义的比较方法
bool myComp(const int &a, const int &b)
{
return a > b; // a > b 从大到小排列
}
int main()
{
//往数组中放数据
//初始化
vector<int> test; //建立vector对象,int 为数组元素类型
vector<int> test2(10); //声明数组大小,并全部初始化为0
vector<int> test3(10, 2); //声明数组大小, 且初始值均为2
vector<int> test33(test3); //声明数组大小,并把test3 拷贝给test4
vector<int> test44(test3.begin() + 1, test3.end()); //把test3的一部分给test4
//通过数组初始化(把一个数组转换成vector)
int nArray[] = {0, 1, 2, 3, 4, 5};
// 将数组指针,第0个到第6个作为初始值赋值给vector
vector<int> test4(nArray, nArray + 6);
// vector基本操作
test.push_back(2); // 向vector中存放数据
test.push_back(3);
test.push_back(4);
//拿数组中元素,当数组中没有元素时不能用下标访问,会访问不到,也就是说确保vector有元素再访问
cout << test[0] << endl; // 2 以数组下标的方式拿数据
cout << test[1] << endl; // 3
cout << test.size() << endl; // 3
cout << test.empty() << endl; // 0 判断是否为空
// test.clear(); 清空vector
cout << "begin: " << *test.begin() << endl; // 第一个元素的iterater
cout << "end: " << *test.end() << endl; // 最后一个元素后面一个位置的iterater
cout << "front: " << test.front() << endl; // 2 第一个元素
cout << "back: " << test.back() << endl; // 4 最后一个元素
test.insert(test.begin(), 1000); //在开头插入数值1000
test.insert(test.begin() + 2, 1000); //在[2]位置插入数值1000
test.erase(test.begin() + 2); // 删除在[2]位置的元素, 也可以区间删除
test.pop_back(); //删除最后一个元素
test.swap(test3); //交换两个vector
// test.clear(); // 清空vector
cout << endl;
//遍历方式 1
for (int i = 0; i < test.size(); i++)
{
cout << test[i] << ", ";
}
cout << endl;
// 遍历方式 2 :使用迭代器访问元素,迭代器可以看作指针
vector<int>::iterator t; //使用遍历器
for (auto t = test.begin(); t != test.end(); t++)
{
cout << *t << ", ";
}
cout << endl;
// 遍历方式3:使用auto迭代,自动识别类型, 需要使用c++11编译
for (auto item : test4)
{
cout << item << ", ";
}
cout << endl;
//算法
//使用reverse将元素翻转:需要头文件#include<algorithm>
int nArray2[] = {0, 1, 2, 3, 4, 5};
vector<int> vec(nArray2, nArray2 + 6);
reverse(vec.begin(), vec.end()); // vec = 5,4,3,2,1,0,
// 使用sort排序:使用系统提供的算法都需要头文件#include<algorithm> : (默认是按升序排列,即从小到大).
sort(vec.begin(), vec.end()); // vec = 0,1,2,3,4,5,
//可以重写排序来降序排列
sort(vec.begin(), vec.end(), myComp); // vec = 5,4,3,2,1,0, 最后一个参数为调用排序方法的名称
for (auto item : vec)
{
cout << item << ", ";
}
cout << endl;
}
二维数组(二维vector)
#include <iostream>
#include <vector>
using namespace std;
//遍历二维数组:方法一 下标访问
void traverseVecvec1(vector<vector<int>> vecvec)
{
if (vecvec.empty()) {
cout << "The vector is empty!" << endl;
return;
}
for (int i = 0; i < vecvec.size(); i++) {
for (int j = 0; j < vecvec[i].size(); j++) {
cout << vecvec[i][j] << " ";
}
cout << endl;
}
}
// 遍历数组方式二: 迭代器
void traverseVecvec2(vector<vector<int>> vecvec)
{
if (vecvec.empty()) {
cout << "The vector is empty!" << endl;
return;
}
// vector<vector<int>>::iterator iter;
for (auto iter = vecvec.begin(); iter != vecvec.end(); iter++) {
//(*iter)表示每一行的vector
for (int i = 0; i < (*iter).size(); ++i) {
cout << (*iter)[i] << " ";
}
cout << endl;
}
}
int main()
{
//第一种初始化方式:尽量不用
vector<vector<int>> vecvec1; //定义一个二维数组
//二维数组行赋值
vector<int> vec1; //第一行
vec1.push_back(1);
vec1.push_back(2);
vec1.push_back(3);
vector<int> vec2; //第二行
vec2.push_back(4);
vec2.push_back(5);
vec2.push_back(6);
vec2.push_back(7);
//把每行放入到二维数组中
vecvec1.push_back(vec1);
vecvec1.push_back(vec2);
traverseVecvec2(vecvec1);
cout << endl;
//第二种初始化:(初始化5行3列)矩阵式
int row = 5;
int col = 3;
vector<vector<int>> vecvec2(row, vector<int>(col)); //定义一个二维数组有row行,每行有col个元素,初始化为0
// 模拟给每个元素赋值
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
vecvec2[i][j] = (i + 1) * (j + 1);
}
}
traverseVecvec1(vecvec2);
}
deque 双端数组
deque(不是queue队列)是双端数组允许使用O(1)对头端进行插入,而vector插入需要O(N)
deque没有容量概念他的空间永远足够的。
#include <iostream>
#include <deque>
using namespace std;
void printDeque(const deque<int>&d){
for (deque<int>::const_iterator iterator = d.begin(); iterator != d.end() ; iterator++)
{
cout << *iterator << endl;
}
}
//大多数方法与vector一样
int main()
{
deque<int> d;
d.push_back(10);
d.push_back(20);
d.push_back(30);
d.push_front(40); //插入到头部
printDeque(d);
d.pop_front();//头删除
d.pop_back();//尾部删除
printDeque(d);
}