如何计算指向不同向量数组中特定对象的指针的出现次数

Posted

技术标签:

【中文标题】如何计算指向不同向量数组中特定对象的指针的出现次数【英文标题】:How to count occurences of a pointer to a specific object in different vector arrays 【发布时间】:2017-01-31 09:07:52 【问题描述】:

我已经定义了一个类node。 一个element 类由四个指向不同节点的指针组成。节点指针可以在元素之间共享。nodeselementsnodeelement 对象的向量数组。

 std::vector<node> nodes;
 std::vector<element>elements; //Each element consist of four node pointer.

指向nodeobject 的指针可以被不同的element 对象共享,即不同的element 对象可能包含指向node 对象的相同指针。如果元素中有nodeobjects 不被两个以上的元素共享,我如何从元素的向量数组中识别element 对象。

示例:node 对象的 ID 为 1,2,3,4,5 和 6。element elem1 包含 ID 为 1,2,3,4 的节点,element elem2 包含 ID 为 3,4 的节点, 5,6。那么这两个元素都满足上述条件。

编辑 1: 我更喜欢不会随机/更改vector elements 的解决方案。必须使用已识别的 element 对象创建新的元素向量

编辑 2: 我的程序旨在解析节点和元素的大数据的输入文件。内存和效率很重要。

【问题讨论】:

识别出elem1elem2 后,您想做什么?在它们上运行一些功能?将它们存放在新容器中?将它们全部洗牌到elements 容器的前面? &lt;algorithm&gt; 中有一些算法可以帮助您实现这些,但我无法在不知道您真正想要实现什么的情况下选择一种。 我将遍历分离出的element 对象的向量并运行一些函数 这听起来像是您的想法,而不是您实际上想要做的事情。您是否需要将它们放入新容器中?还是您只需要在它们上调用一个函数,但您认为这意味着您需要在新容器中使用它们? 如果需要统计引用,请查看std::shared_ptr::use_count。 @YuriyIvaskevych 我不认为生命周期是个问题;不必要的共享所有权只会让事情变得混乱。 【参考方案1】:

基本上,您需要做的第一步是确定存在多少唯一节点指针。您可以解析elementsvector 并将所有node 指针存储在map 中,如下所示

map<node*, std::list<element> > node_to_element

此映射中的每个条目都将存储引用node 指针的elementobjects 列表

接下来,您需要迭代此映射并找出列表大小

一旦你有了这些条目,你就有了 element 对象,它们引用不超过 2 个 node 指针

编辑

正如@sameerkn & @0x499602D2 指出的那样,地图可以修改成这样

map <node *, std::vector<int> > node_to_element_indexes

其中std::vector&lt;int&gt;可用于存储std::vector&lt;element&gt; elements中引用node *的元素对象的索引

【讨论】:

map&lt;node*, std::list&lt;int&gt;&gt; node_to_element;。代替std::list&lt;element&gt;,可以使用std::list&lt;int&gt;,它将存储std::vector&lt;element&gt; elements;的索引 @Rishi,感谢您提供见解 你为什么决定使用链表而不是向量? vector 可以使用。我刚刚发布了一个例子。我喜欢上面 cmets 中提到的@sameerkn 建议。可以通过使用 std::vector&lt;int&gt; 来修改建议,它将存储 std::vector&lt;element&gt; elements 的索引

以上是关于如何计算指向不同向量数组中特定对象的指针的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

指向向量中对象的指针有时指向向量中的不同对象

当向量在内部类中时,如何删除指向对象的向量指针

如何计算元素在数组中特定位置出现的次数? [关闭]

如何从 C++ 中的“指向对象的指针”向量访问对象

我是不是正确删除了指向对象的指针向量?

如何从指向对象的指针向量中删除对象? [复制]