如何在 std::vector<> 中反转每个谓词的含义?
How to invert the sense of each predicate in a std::vector<> of them?
我有两个谓词向量:
typedef std::function<bool(int)> pred;
vector<pred> v1;
vector<pred> v2;
我需要将它们合并为一个,但是第二个向量的谓词应该反转(即在它们正常返回false
的情况下,它们应该返回true
)。所以,实际上我需要一种"反转"包装器。
我创建了一个反转函数和一个结构,它保存一个原始谓词并反转其值:
struct inverted
{
pred pr;
inverted(pred pr_) : pr(pr_) {}
bool operator () (int i) {return !pr(i);}
};
pred CreateInverted(pred pr)
{
return inverted(pr);
}
使用它,向量谓词的反转可能如下所示:
transform( v2.begin(), v2.end(), v2.begin(), CreateInverted );
但我想知道是否有更好的解决方案,特别是基于标准库的解决方案?
没有C++11,允许提升。
如果谓词遵循某些约定,则可以使用 std::not1
创建反转谓词。下面是一个示例:
struct foobar : std::unary_function<bool, int>
{
bool operator()(int value) const { return value > 42; }
};
do_something_if(values.begin(), values.end(), std::not1(foobar());
标准库有一个 std::not1
谓词,它采用一元谓词并产生参数的否定,因此无需为此提供自己的函子 [代码未测试,您可能需要更正语法]:
std::transform( v.begin(), v.end(), v.begin(),
std::not1< std::function<bool(int)> > );
我想不
出更好的方法来解决你的问题。
您实际上将transformer
函数与应该完全用于您的目的的stl::transform
一起使用。
这几乎是相当可观的参考代码!
相关文章:
- std::condition_variable::wait()如何评估给定的谓词
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- EASTL矢量<向量<int>>连续的
- 如何在 STL 函数中找到传递给谓词的元素的索引?
- 为 C++11 算法组合多个谓词
- 处理 std::enable_if<...中谓词的逻辑"OR">
- std::map与谓词与初始化列表
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- 如何有效地操作满足给定谓词的向量中的所有项目?
- 排序谓词没有传递对索引对象的引用?
- 将 unordered_map 与 Catch2 谓词一起使用时类型不匹配
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 如何在算法中使用谓词函数find_if?
- 是否可以使用三元切换/控制/谓词成员函数调用?
- 'std::condition_variable::wait_for"经常调用谓词
- 为什么以及如何在 C++ 中使用 bind() 作为谓词?
- 如何为 std::unordered_set 定义自定义键等效谓词?
- 如何在C++03中用自定义谓词调用std::unique
- C++根据限定谓词压缩数组
- 解释标准库排序函数C++的比较谓词的工作原理?