跳转至

浅谈vector容器

这大概是记录一下自己使用vector容器的经历吧,希望可以对大家有所启发。如果你还不会使用vector容器,你可以找到很多非常好的资源,不管是从书上还是从互联网上。

没有办法把所有的方法都写一遍,你可以看参考手册或其他资料。下述代码在openSUSE Tumbleweed + JetBrains CLion 2018.3.4 + gcc 8.2.1上构建并测试运行通过。

更新:对不起,忘记说了,项目标准是C++11:

1
set(CMAKE_CXX_STANDARD 11)

刚开始学习的时候

大概是能勉强使用一些基本的成员函数,比如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vector;
    vector.push_back(0);
    vector.push_back(1);
    vector.push_back(2);
    vector.push_back(3);
    vector.push_back(4);
    vector.push_back(5);

    std::cout << vector.front() << *(vector.begin() + 1) << vector[2]
              << vector.at(3) << *(vector.end() - 2) << vector.back()
              << vector.size() << std::endl;

    return 0;
}
构建并运行可以得到:
1
2
3
4
/home/domain/CLionProjects/untitled_cpp11/cmake-build-debug/untitled_cpp11
0123456

Process finished with exit code 0

还有其它的一些例如插入、删除等操作:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <vector>

template <typename T>
void println(const std::vector<T> &vector) {
    for (size_t i = 0; i < vector.size(); ++i) {
        std::cout << vector[i] << ' ';
    }
    std::cout << std::endl;
}

int main() {
    std::vector<int> vector;
    vector.push_back(0);
    println(vector);
    vector.insert(vector.begin(), -1);
    println(vector);
    vector.erase(vector.end() - 1);
    println(vector);
    vector.clear();
    std::cout << (vector.empty() ? "TRUE" : "FALSE") << std::endl;

    return 0;
}
构建并运行可以得到:
1
2
3
4
5
6
7
/home/domain/CLionProjects/untitled_cpp11/cmake-build-debug/untitled_cpp11
0 
-1 0 
-1 
TRUE

Process finished with exit code 0

学会使用一些算法

后来是会使用一些排序等算法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <vector>
#include <algorithm>

template <typename T>
void println(const std::vector<T> &vector) {
    for (size_t i = 0; i < vector.size(); ++i) {
        std::cout << vector[i] << ' ';
    }
    std::cout << std::endl;
}

int main() {
    std::vector<int> vector;
    vector.push_back(3);
    vector.push_back(2);
    vector.push_back(1);
    println(vector);
    std::sort(vector.begin(), vector.end());
    println(vector);
    std::reverse(vector.begin(), vector.end());
    println(vector);

    return 0;
}
可以得到:
1
2
3
4
5
6
/home/domain/CLionProjects/untitled_cpp11/cmake-build-debug/untitled_cpp11
3 2 1 
1 2 3 
3 2 1 

Process finished with exit code 0
还有大量算法可以在这里查阅。

构造函数

最早大概是这样子糊弄一维数组的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vector;
    for (int i = 0; i < 5; ++i) {
        vector.push_back(0);
    }

    return 0;
}
看到IDE的建议,于是Alt+Enter,为vector预留空间:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vector;
    vector.reserve(5);
    for (int i = 0; i < 5; ++i) {
        vector.push_back(0);
    }

    return 0;
}
但是到后来才知道应该利用构造函数:
1
2
3
4
5
6
7
8
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vector(5, 0);

    return 0;
}
具体可查看参考。对,即使是这样,也还是有黑历史,比如二维数组:(反例请勿模仿)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>

int main() {
    std::vector<std::vector<int> > vector;
    std::vector<int> vec;
    vec.reserve(5);
    for (int ic = 0; ic < 5; ++ic) {
        vec.push_back(0);
    }
    vector.reserve(5);
    for (int ir = 0; ir < 5; ++ir) {
        vector.push_back(vec);
    }

    return 0;
}
后来才慢慢悟出应该这样:
1
2
3
4
5
6
7
8
#include <iostream>
#include <vector>

int main() {
    std::vector<std::vector<int> > vector(5, std::vector<int>(5, 0));

    return 0;
}
未完待续

评论