0

在过去的 6 年里,我几乎完全是一名 C# 程序员。我现在正在做一个项目,其中 C++ 是首选语言,STL 是我们的集合库。

在使用 C# 的 LINQ 之后,我很难进入 STL 的思维框架。

例如:编写一个等效的 IEnumerator.Select。

C#

public static IEnumerator<Output> Select(this IEnumerator<Input> input, Func<Input, Output> func) {
  while (input.MoveNext) {
    yield return func(input.Current);
  }
}

超级容易。

现在尝试用 C++ 和 STL 编写类似的东西。(撇开 yield 关键字和匿名函数的方便语法问题)。

如果不首先回答一些困难的问题,它甚至无法完成。因为 STL 枚举器使用枚举器间比较而不是 MoveNext,所以您必须确定枚举器的终端值是什么。然后你必须搞砸所有的 iterator_traits 废话。STL 使用编译时模板分派而不是运行时动态分派,因此您的迭代器不仅必须在输入枚举器的 value_type 上进行模板化,而且还必须在特定类型的输入枚举器上进行模板化。

甚至不要让我开始尝试在 STL 中编写 map-join 迭代器。

通过查看其他人编写的代码,我得出结论,未使用 Boost 增强的 STL 很少用于集合和排序以外的任何事情。

我最近的观察是:

  1. 有没有办法在 STL 中简洁地编写突变迭代器?
  2. 你如何简洁地将一个集合复制到另一个集合中?

更一般地说,我注意到一些与我习惯的思维方式相冲突的事情:

  1. STL 代码似乎并不简洁。在编写 STL 代码时,我编写简洁代码的目标是一种责任吗?(不简洁,我的意思是,通常涉及很长的类型标识符)
  2. Boost 似乎是在 STL 中编写算法的近乎要求。不允许使用 Boost 的人会做什么?
4

1 回答 1

2

你的一些问题对我来说真的没有多大意义。例如,您谈到必须处理“enumerator_traits”。我不太确定你在说什么。也许你的意思是iterator_traits?我不记得曾经使用过任何称为“enumerator_trait”的东西,我也找不到在 C++ 标准中提到过这样的东西。

iterator_traits至少存在,但它们是我很少“搞砸”的东西。我从外围知道他们的存在,但仅此而已。我已经编写了相当多的迭代器和算法,但从未对其中任何一个做过任何具体iterator_traits的事情。

让我们来解决创建一个新集合的具体问题,该集合是另一个集合的排序版本。这在许多不同的方面都相当容易。 std::partial_sort_copy当然可以这样做:

#include <algorithm>
#include <vector>
#include <iterator>
#include <iostream>

int main() { 

    std::vector<int> input;

    // generate some data to sort
    std::generate_n(std::back_inserter(input), 20, rand);

    // a destination for the sorted data:
    std::vector<int> result(input.size());

    // do the sort/copy:
    std::partial_sort_copy(input.begin(), input.end(),
        result.begin(), result.end());

    // show the sorted data:
    std::copy(result.begin(), result.end(), 
        std::ostream_iterator<int>(std::cout, "\n"));

    return 0;
}

然而,出于许多目的,制作副本更容易,然后排序:

std::vector<int> result(input.begin(), input.end());
std::sort(result.begin(), result.end());

如果您真的希望它简洁,您可以将副本复制到先天排序的数据结构中:

std::multiset<int> result(input.begin(), input.end());

然而,最后一个通常会牺牲一点效率来缩短代码。在许多(大多数?)情况下,这不是问题,但如果您发现它太慢,可以轻松获得更快的替代方案。

于 2012-04-04T19:38:20.917 回答