制作比较器函数的向量
Make a vector of comparator functions
我的问题是用不同的比较器函数std::less
和std::greater
测试快速排序的实现。但是我不想复制粘贴仅仅在两个比较器中不同的测试代码,所以我想把它们放入一个向量(或者其他东西?)并迭代它们。
为了简化这篇文章,假设我想在两个函数的向量上写一个循环,得到0
和1
作为它们的参数,并输出一个布尔值。以下是我的看法:
#include <iostream>
#include <vector>
#include <functional>
int main() {
auto fs = std::vector<>{std::less<int>{}, std::greater<int>{}};
for (auto f: fs) {
std::cout << f(0, 1) << " ";
} std::cout << std::endl;
}
我的g++ 6.1.1
编译器正确地抱怨我没有为vector指定模板实参。我一直在尝试std::function<bool(int, int)>
和其他东西,但没有运气。
你能告诉我如何修复这段代码吗?
更新:我得到的确切错误:
% g++ -std=c++14 -Wall deleteme.cpp && ./a.out
deleteme.cpp: In function ‘int main()’:
deleteme.cpp:6:27: error: wrong number of template arguments (0, should be at least 1)
auto fs = std::vector<>{std::less<int>{}, std::greater<int>{}};
^
In file included from /usr/include/c++/6.1.1/vector:64:0,
from deleteme.cpp:2:
/usr/include/c++/6.1.1/bits/stl_vector.h:214:11: note: provided for ‘template<class _Tp, class _Alloc> class std::vector’
class vector : protected _Vector_base<_Tp, _Alloc>
^~~~~~
deleteme.cpp:8:18: error: unable to deduce ‘auto&&’ from ‘fs’
for (auto f: fs) {
^~
只有在c++ 17中,构造函数的模板参数才可以用来推断该类型的模板参数,所以你必须写std::vector<std::function<bool(int,int)>>
而不是std::vector<>
。
请注意,与直接调用函数相比,std::function
具有性能开销,因此您可能需要检查可变模板参数(并吞下)以获得最后几个百分比
当您使用不同的类型时,您可以使用tuple,并遍历tuple:
namespace detail {
template <typename F, typename TUPLE, std::size_t ... Is>
void run_for_each(F&& f, TUPLE&& t, std::index_sequence<Is...>)
{
const int dummy[] = {0, (f(std::get<Is>(std::forward<TUPLE>(t))), void(), 0)...};
static_cast<void>(dummy); // Avoid warning for unused variable
}
}
template <typename F, typename TUPLE>
void run_for_each(F&& f, TUPLE&& t)
{
detail::run_for_each(std::forward<F>(f),
std::forward<TUPLE>(t),
std::make_index_sequence<
std::tuple_size<std::decay_t<TUPLE>>::value>());
}
和
int main() {
auto t = std::make_tuple(std::less<int>{}, std::greater<int>{});
run_for_each([](auto&&f) {std::cout << f(0, 1) << " ";}, t);
std::cout << std::endl;
}
演示相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如何使用向量的template_back函数
- 如何删除除 ArduinoSTL 的向量函数之外的所有函数
- 在使用标准向量函数时引发'std::bad_alloc'实例后调用的终止
- 我可以为向量函数返回 NULL<double> 吗?
- 将多个向量(函数结果)组合到一个使用模板中
- 如何在 c++ 中制作通用字符串到向量函数
- 为什么简单的C++向量函数会产生越界的下标
- 为什么我的向量函数的返回值总是 1
- 模板化向量函数参数的std::is_base_of
- 我的程序没有运行,多维向量函数
- C 如何使2D向量函数
- 如何从 v8 返回向量<T> C++ 函数
- C++ 如何使此向量函数接受任何分隔符
- 我想返回一个向量函数,<Competition>但被告知竞争是未声明的,并且我正在使用未定义的类'std::vector'
- C++:如何在类中使用向量函数
- 自己的"Insert"方法(向量)函数模板
- c++中的内存泄漏:循环中的向量函数
- 如何添加一个元素到一个向量函数
- 向量函数'at'