如何在c++中检查谓词是否为真
How to check if predicate is true in c++?
我知道他们应该做什么,但我不知道如何检查,例如,当int数据被赋予函数时,它们是否满足Pred-Pred。例如,我在一个单独链接的列表中有这个函数:Node<T>* extract(Node<T>*& head, Pred pred)
用这些值检查头部->数据:extract(listAi,[](int n) {return n % 2 == 0; });
pred
对象的参数将是Node<T>
中的重要数据成员。例如,列表枚举中的当前节点正在提取中执行。
展望不明智的手动内存管理(所有这些都是学术性的,因为在现实世界中你会使用正确的C++容器和算法(
#include <iostream>
#include <utility>
template<class T>
struct Node
{
T value;
Node *next;
Node(T obj)
: value(std::move(obj))
, next(nullptr)
{
}
};
template<class T, class Pred>
Node<T> *extract(Node<T>*& head, Pred&& pred)
{
Node<T> *result = nullptr;
Node<T> **ppSrc = &head;
Node<T> **ppDst = &result;
while (*ppSrc)
{
if (pred((*ppSrc)->value)) // HERE: note value from node passed
{
*ppDst = *ppSrc;
ppDst = &(*ppDst)->next;
*ppSrc = (*ppSrc)->next;
}
else
{
ppSrc = &(*ppSrc)->next;
}
}
// terminate the extracted list
*ppDst = nullptr;
return result;
}
template<class T>
void printList(Node<T> const* head)
{
if (head)
{
while (head)
{
std::cout << head->value << ' ';
head = head->next;
}
std::cout << 'n';
}
}
int main()
{
Node<int> *lst = nullptr;
Node<int> **pp = &lst;
for (int i=1; i<10; ++i)
{
*pp = new Node<int>(i);
pp = &(*pp)->next;
}
*pp = nullptr;
printList(lst);
Node<int> *odds = extract(lst, [](int value) { return value % 2;});
printList(odds);
printList(lst);
while (lst)
{
auto tmp = lst;
lst = lst->next;
delete tmp;
}
while (odds)
{
auto tmp = odds;
odds = odds->next;
delete tmp;
}
}
输出
1 2 3 4 5 6 7 8 9
1 3 5 7 9
2 4 6 8
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- std::condition_variable::wait()如何评估给定的谓词
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 是否可以使用三元切换/控制/谓词成员函数调用?
- std::unordered_set 是否对任何对象进行摊销常量查找时间,而不考虑谓词
- 什么 STL 算法可以确定容器中的一个项目是否满足谓词?
- 是否有使用谓词比较两个范围的标准方法
- 是否可以使用给定参数为结构创建推力的功能谓词?
- 用于检查容器的值是否在范围内的谓词
- 分支预测的加速是否取决于谓词的复杂性?
- 是否允许标准库算法复制谓词参数
- 是否可以在谷歌测试的谓词格式化程序中使用ASSERT_NEAR
- 是否允许 STL 谓词使用其参数的地址?
- 确定谓词是否适用于一个范围的全部、部分或全部元素
- 带有lambda谓词和auto元素的std::remove_if是否可行
- C++编译时谓词,用于测试是否可以使用 T 类型的参数调用 F 类型的可调用对象