gpt4 book ai didi

c++ - STL算法的可组合性

转载 作者:IT老高 更新时间:2023-10-28 12:31:08 25 4
gpt4 key购买 nike

STL 算法在 C++ 中非常有用。但让我恼火的一件事是它们似乎缺乏可组合性。

例如,假设我有一个 vector<pair<int, int>>并希望将其转换为 vector<int>仅包含 second对的成员。这很简单:

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算法,并同时使用 transformcopy_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; });

这对我来说似乎相当浪费。我能想到的避免临时 vector 的唯一方法是放弃 transformcopy_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 算法组合成一个新算法的好方法?

最佳答案

你是对的。您可以使用Boost.Range adaptors实现构图。

关于c++ - STL算法的可组合性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6743093/

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