gpt4 book ai didi

c++ - 元素如何在 vector 中找到自己的索引?

转载 作者:行者123 更新时间:2023-11-30 04:17:39 24 4
gpt4 key购买 nike

我正在尝试使用 std::unique_ptr 重新实现树数据结构,其想法是父节点将拥有其子节点,这些子节点存储在 unique_ptr 的 vector 中

出于接口(interface)原因,我需要一个节点销毁自身的方法。在这种情况下,我认为该节点将其自身从其父节点的子 vector 中删除。

以下实现“有效”(在 c++11 编译器中),但它非常丑陋,我确信这是处理此问题的次优方法。

#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>

struct Node {
typedef std::vector<std::unique_ptr<Node>> vec_node_uptr;

unsigned id;
Node* parent;
vec_node_uptr child_nodes;

// ctor
Node(unsigned id): id(id){ parent = nullptr; }

void add_child(Node* new_child){
new_child -> parent = this;
child_nodes.push_back( std::unique_ptr<Node>(std::move(new_child) ) );
}

int where_am_i(){
int result_ = 0;
for(auto& i: this -> parent -> child_nodes) {
if (this == i.get()) {
return result_;
} else {
result_++;
}
}
}

void suicide(){
parent -> child_nodes.erase(parent -> child_nodes.begin()+ where_am_i());
}
};


int main()
{
std::unique_ptr<Node> root(new Node(0));

root -> add_child(new Node(1));
root -> add_child(new Node(2));

root -> child_nodes[0] -> add_child(new Node(3));
root -> child_nodes[0] -> add_child(new Node(4));
root -> child_nodes[1] -> add_child(new Node(5));
root -> child_nodes[1] -> add_child(new Node(6));

root -> child_nodes[1] -> suicide();

return 0;
}

有什么建议吗?也许使用 std::find

最佳答案

您可以使用 find_if 和 lambda 更优雅地解决此问题:

void suicide() 
{
auto& parentsChildren = parent->child_nodes;
parentsChildren.erase(find_if(begin(parentsChildren), end(parentsChildren),
[&](const unique_ptr<Node>& node) { return node.get() == this; }));
}

关于c++ - 元素如何在 vector 中找到自己的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16984632/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com