我不明白为什么他们在 C++ STL 中分离了算法、迭代器和容器。如果到处都大量使用模板,那么我们可以让类在一个地方使用模板参数将所有东西都放在一个地方。
我得到的一些文本解释说,迭代器有助于算法与容器数据交互,但是如果容器公开一些机制来访问它拥有的数据呢?
我不明白为什么他们在 C++ STL 中分离了算法、迭代器和容器。如果到处都大量使用模板,那么我们可以让类在一个地方使用模板参数将所有东西都放在一个地方。
我得到的一些文本解释说,迭代器有助于算法与容器数据交互,但是如果容器公开一些机制来访问它拥有的数据呢?
使用M
容器 +N
算法,通常需要一段M * N
代码,但使用充当“胶水”的迭代器,这可以简化为一段M + N
代码。
示例:在 3 个容器上运行 2 个算法
std::list<int> l = { 0, 2, 5, 6, 3, 1 }; // C++11 initializer lists
std::vector<int> v = { 0, 2, 5, 6, 3, 1 }; // C++11 initializer lists
std::array<int, 5> a = { 0, 2, 5, 6, 3, 1 };
auto l_contains1 = std::find(l.begin(), l.end(), 1) != l.end();
auto v_contains5 = std::find(v.begin(), v.end(), 5) != v.end();
auto a_contains3 = std::find(a.begin(), a.end(), 3) != a.end();
auto l_count1 = std::count(l.begin(), l.end(), 1);
auto v_count5 = std::count(v.begin(), v.end(), 5);
auto a_count3 = std::count(a.begin(), a.end(), 3);
您只调用 2 种不同的算法,并且只有 3 个容器的代码。每个容器将begin()
和end()
迭代器传递给容器。即使您有几3 * 2
行代码来生成答案,也只有3 + 2
部分功能需要编写。
对于更多的容器和算法,这种分离极大地减少了代码中的组合爆炸,否则会随之而来:STL 中有 5 个序列容器、8 个关联容器和 3 个容器适配器,并且<algorithm>
单独有近 80 个算法(不是甚至计算<numeric>
) 中的那些,这样您的代码16 + 80
就16 * 80
减少了 13 倍!(当然,并不是每个算法对每个容器都有意义,但重点应该很清楚)。
迭代器可以分为 5 类(输入、输出、转发、双向和随机访问),一些算法会根据迭代器的能力委托给专门的版本。这将在一定程度上减少代码减少,但通过选择最适合手头的迭代器的算法来大大提高效率。
请注意,STL 在分离方面并不完全一致:std::list
有自己的sort
成员函数,使用特定于实现的细节来对自己进行排序,并且std::string
有大量的成员函数算法,其中大部分可以作为非成员函数实现。