c++ - 如何将 find_if 与链表等非容器一起使用?

标签 c++ algorithm c++11 linked-list iterator

我正在尝试算法支持静态对象列表。我尝试过多种方式来实现这一点,但唯一能让它起作用的方法是编写一个传统的 C for 循环。

例子:

class ListNode
{
public:
    ListNode(int id);
    virtual ~ListNode() {}

    // Container support functions
    ListNode* operator++() {return m_nextNode;}
    static ListNode* findNode(int p_id);
    static ListNode* m_nodeList{nullptr};

private:
    int m_id;
    ListNode *m_nextNode;

protected:
    static void addNewNode(ListNode* p_node);

    friend ListNode* begin(void);
};

inline ListNode* begin(void) {return ListNode::m_nodeList;}
inline ListNode* end(void) {return nullptr;}

// Declare the list head
ListNode* ListNode::m_nodeList = nullptr;

// Constructor
ListNode::ListNode (int id): m_id{id}
{
    ListNode::addNewNode(this);
}

// Add node to front of list
void ListNode::addNewNode(ListNode* p_node)
{
    p_node->m_nextService = m_nodeList;
    m_nodeList = p_node;
}

//
// The following are all the find implementation attempts
//

ListNode* ListNode::failedFind1(int id) {
   return std::find_if(ListNode::m_nodeList,
      static_cast<ListNode*>(nullptr),
      [p_serviceNumber](const ListNode& s) {
         return id==s.m_id;
      }
);

我还使用定义的 begin()end() 函数进行了尝试。唯一有效的是以下内容:

for (auto *s = m_nodeList; s != nullptr; s = s->m_nextNode)
{
    if (s->m_id == id)
        return s;
}
return nullptr;

我错过了什么?

最佳答案

感谢您的反馈。

我为安全关键型应用程序开发软件。通常不允许使用动态内存。 STL链表类是一个独立的数据结构,用来维护一个对象列表。我们有对象,只需要它们作为 STL 兼容的容器对象。 (这就是为什么)

link非常有用。问题是增量运算符的错误定义。

关于c++ - 如何将 find_if 与链表等非容器一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52560766/

相关文章:

c++ - constexpr 问题,为什么这两个不同的程序在 g++ 中运行的时间如此不同?

c++ - 从 vector 中删除项目,而在 C++11 范围 'for' 循环中?

C++:绑定(bind)到基类

c++ - 当类声明似乎有两个名称时,这意味着什么?

java - 定义轮廓是否闭合

algorithm - 三值中值策略

c++ - 为什么从指针使用类函数时会出现 SIGSEGV 错误?

c++ - 抑制下载速度的变化

c++ - 如何渲染实例粒子

java - 链接二叉树并删除叶子