gpt4 book ai didi

c++ - 为什么 C++ STL 中的算法、迭代器和容器是分离的

转载 作者:可可西里 更新时间:2023-11-01 17:04:15 25 4
gpt4 key购买 nike

我不明白为什么他们在 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 个容器适配器,并且有将近 80 个算法<algorithm>单独(甚至不包括 <numeric> 中的那些)所以你只有 16 + 80而不是 16 * 80 ,代码量减少了 13 倍! (当然,并不是每个算法对每个容器都有意义,但要点应该很清楚)。

迭代器可以分为 5 类(输入、输出、前向、双向和随机访问),一些算法会根据迭代器的能力委托(delegate)给专门的版本。这将在一定程度上减少代码减少,但通过选择最适合手头迭代器的算法来大大提高效率。

请注意,STL 中的分离并不完全一致:std::list有自己的sort使用实现特定细节对自身进行排序的成员函数,以及 std::string有大量的成员函数算法,其中大部分可以作为非成员函数实现。

关于c++ - 为什么 C++ STL 中的算法、迭代器和容器是分离的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11947151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com