STL 算法在 C++ 中非常有用。但让我感到厌烦的一件事是它们似乎缺乏可组合性。
例如,假设我有 avector<pair<int, int>>
并且想要将其转换为vector<int>
仅包含对的second
成员的 a。这很简单:
std::vector<std::pair<int, int>> values = GetValues();
std::vector<int> result;
std::transform(values.begin(), values.end(), std::back_inserter(result),
[] (std::pair<int, int> p) { return p.second; });
或者,也许我只想过滤vector
那些first
成员为偶数的对。也很简单:
std::vector<std::pair<int, int>> values = GetValues();
std::vector<std::pair<int, int>> result;
std::copy_if(values.begin(), values.end(), std::back_inserter(result),
[] (std::pair<int, int> p) { return (p.first % 2) == 0; });
但是如果我想两者都做呢?没有transform_if
算法,并且使用两者transform
似乎copy_if
需要分配一个临时vector
来保存中间结果:
std::vector<std::pair<int, int>> values = GetValues();
std::vector<std::pair<int, int>> temp;
std::vector<int> result;
std::copy_if(values.begin(), values.end(), std::back_inserter(temp),
[] (std::pair<int, int> p) { return (p.first % 2) == 0; });
std::transform(values.begin(), values.end(), std::back_inserter(result),
[] (std::pair<int, int> p) { return p.second; });
这对我来说似乎相当浪费。我能想到的避免临时向量的唯一方法是放弃transform
并copy_if
简单地使用for_each
(或常规的 for 循环,以适合您的方式):
std::vector<std::pair<int, int>> values = GetValues();
std::vector<int> result;
std::for_each(values.begin(), values.end(),
[&result] (std::pair<int, int> p)
{ if( (p.first % 2) == 0 ) result.push_back(p.second); });
我在这里错过了什么吗?有没有一种不需要临时存储就可以将两个现有的 STL 算法组合成一个新算法的好方法?