C++学习笔记 —— STL之vector


参考文章
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);
}
发布了103 篇原创文章 · 获赞 94 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/105524107