如何在c++中检查谓词是否为真

How to check if predicate is true in c++?

本文关键字:谓词 是否 检查 c++      更新时间:2024-09-22

我知道他们应该做什么,但我不知道如何检查,例如,当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