如何在 C++ 中检查谓词是否为真?
How to check if predicate is true in c++?
我知道他们应该做什么,但我不知道如何检查,例如,当将 int 数据提供给函数时,它们是否满足 Pred pred。
例如,我在单链表中有这个函数:
Node<T>* extract(Node<T>*& head, Pred pred)
使用这些值来检查 head->data:
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
我知道他们应该做什么,但我不知道如何检查,例如,当将 int 数据提供给函数时,它们是否满足 Pred pred。
例如,我在单链表中有这个函数:
Node<T>* extract(Node<T>*& head, Pred pred)
使用这些值来检查 head->data:
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