将一元函数应用于向量的某些元素的良好实现是什么?
What's a good implementation of applying a unary function to some elements of a vector?
我想将函数UnaryFunction f
应用于 std 容器的某些元素,给定谓词UnaryPredicate p
- 如果您组合std::partition
然后将std::for_each
应用于其中一个分区,您会得到什么。
我对C++很陌生,所以请原谅我的无知。但是,我已经在<algorithm>
中寻找合适的实现,但我似乎找不到所需的功能。
基于 cppreference.com 可能的实现,我想出了以下内容:
template<class InputIt, class UnaryPredicate, class UnaryFunction>
UnaryFunction for_each_if(InputIt first, InputIt last, UnaryPredicate p, UnaryFunction f)
{
for (; first != last; ++first) {
if (p(*first))
{
f(*first);
}
}
return f;
}
返回值是按照std::for_each
建模的,尽管OutputIter
可能是更好的选择。不过,这需要一个更复杂的实现,所以这次我选择了简洁而不是技巧。替代实现留给读者作为练习。
我的问题是:在 std 库中是否已经有既定的方法可以做到这一点?如果不是,这是否是此类函数模板的合理实现?
STL不能很好地支持算法的组合。正如你所说,你可以先调用partition
,然后如果你不关心元素的顺序,可以在其中一个分区上调用for_each
。
对于一个新项目,或者一个可以引入库的项目,我强烈建议你看看一个范围库,例如 Boost.Range 或 Eric Niebler 的 range-v3。
使用范围库,可以像这样完成:
template<typename R, typename P, typename F>
F for_each_if(R& rng, P pred, F f)
{
using namespace boost::adaptors;
return (rng | filtered(pred) | for_each(f));
}
就评论而言,在 std 库中似乎没有实现这一点。但是,正如user2672165所指出的,谓词可以很容易地包含在函数中。为了说明这一点,请参阅 cppreference.com 的以下修改版本的for_each
示例:
#include <vector>
#include <algorithm>
#include <iostream>
struct Sum {
Sum() { sum = 0; }
void operator()(int n) { sum += n; }
int sum;
};
int main()
{
std::vector<int> nums{3, 4, 2, 9, 15, 267};
std::cout << "before: ";
for (auto n : nums) {
std::cout << n << " ";
}
std::cout << 'n';
std::for_each(nums.begin(), nums.end(), [](int &n){ if (n > 5) n++; });
// Calls Sum::operator() for each number
Sum s = std::for_each(nums.begin(), nums.end(), Sum());
std::cout << "after: ";
for (auto n : nums) {
std::cout << n << " ";
}
std::cout << 'n';
std::cout << "sum: " << s.sum << 'n';
}
在这里,谓词被添加到函数中,因此[](int &n){ n++; }
现在变得[](int &n){ if (n > 5) n++; }
仅将函数应用于大于 5 的整数元素。
预期输出为
before: 3 4 2 9 15 267
after: 3 4 2 10 16 268
sum: 303
希望这对其他人有所帮助。
- 从字符数组的元素中减去'a'是什么意思
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- 在向量中查找大于 0(或通常为 k)的最小元素的最佳方法是什么?
- 通过作为指向 C++ 函数的指针传递来访问 std::array 元素的正确方法是什么?
- 找到对称矩阵的最大元素的最有效算法是什么
- 返回向量元素的 l 值的正确方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 从长(且合理)稀疏向量中选择随机元素的最有效方法是什么?
- " ans += (a[i] - ans * r > 0); "是什么意思,其中 ans,r 是整数,a[i] 是数组元素?
- 在查找子集中元素和元素数量之间的二进制比较背后的逻辑是什么?
- 我如何找出3D容器的元素是什么类型
- 的每个元素是什么意思?
- 在 c 和 c++ 中,二维数组的元素是什么类型?
- 使用 CDT 从头文件中获取属性定义的节点元素是什么
- 在 typedef 中有三个元素是什么意思 C++.
- 数组在方括号中增加元素是什么意思
- 如何知道您输入到std::array中的最后一个元素是什么?
- 我读了map.erase(map.end());删除地图的最后一个元素。但是最后一个元素是什么?它是否基于元素的插入顺序?
- 向量中的第一个元素是什么
- 对象指针向量中的元素是什么