对象传染媒介与识别号码和连接的

时间:2014-12-04 09:59:10

标签: c++ object vector

我正在尝试这样做:

我想有一个矢量(std :: vector),其对象定义如下:

class MyObj{
   private:
       idNumber= // it could be a pointer
       firstConnection= // it could be a pointer
       secondConnection= // it could be a pointer
   public:
   ...
};

vector<MyObj> vectorOfObj(10);

所以我想要对象的idNumber,它是向量的元素,对应于同一元素的索引,并设置元素之间的连接(双向)(例如vectorOfObj[5]vectorOfObj[7]vectorOfObj[4]连接)我希望元素保持其引用有效(id和amp; connections)如果修改了向量的结构(例如,如果元素6设置为4并且4在6中设置,对象改变其id,如果5与4连接则现在与6)连接。如果值得,我会接受所有类型的解决方案。我想了很多,但我找不到解决方案。

我希望我很清楚。三江源!

3 个答案:

答案 0 :(得分:0)

你可以这样使用

map<yourcommonthing, vector<MyObj>> yourMap;

那么所有具有共同点的MyObj都可以分组,这也是地图的关键。

如果idNumber是一个或多个MyObj中的公共,那么,

map<idNumber, vector<MyObj>> vectorOfObj;

答案 1 :(得分:0)

您的描述告诉我您可能正在寻找图表表示。

您可以在此处使用Boost Graph:

<强> Live On Coliru

#include <boost/graph/adjacency_list.hpp>
#include <boost/range.hpp> // make_iterator_range
#include <iostream>
#include <iomanip> // for std::setw

using namespace boost;

struct MyObj{
    int idNumber;
};

typedef adjacency_list<vecS, vecS, bidirectionalS, MyObj> Graph;

int main() {
    Graph g;

    Graph::vertex_descriptor // essentially, index into the vector of MyObj
        node1 = add_vertex(MyObj {42}, g),
        node2 = add_vertex(MyObj { 7},  g),
        node3 = add_vertex(MyObj {99}, g),
        node4 = add_vertex(MyObj {-1}, g);

    std::cout << "node1: " << node1 << "\n"; // 0
    std::cout << "node2: " << node2 << "\n"; // 1
    std::cout << "node3: " << node3 << "\n"; // 2
    std::cout << "node4: " << node4 << "\n"; // 3

    add_edge(node1, node3, g);
    add_edge(node2, node3, g);
    add_edge(node4, node1, g);

    // now we have a graph with these connections:
    for(auto const& connection: make_iterator_range(edges(g)))
    {
        Graph::vertex_descriptor sd = source(connection, g);
        Graph::vertex_descriptor td = target(connection, g);
        MyObj const& s = g[sd];
        MyObj const& t = g[td];

        std::cout << "Connection of " << sd << " (idNumber=" << std::setw(2) << s.idNumber << ") <-> "
                                      << td << " (idNumber=" << std::setw(2) << t.idNumber << ")\n";
    }

}

输出:

node1: 0
node2: 1
node3: 2
node4: 3
Connection of 0 (idNumber=42) <-> 2 (idNumber=99)
Connection of 1 (idNumber= 7) <-> 2 (idNumber=99)
Connection of 3 (idNumber=-1) <-> 0 (idNumber=42)

答案 2 :(得分:0)

所以,你有一个常规的Graph。 您可以通过两种主要方式存储您的参考资料:

我认为最简单的解决方案是使用edjes列表,

std::vector<std::pair<int, int>> connections;

每次要查找连接点时,都必须浏览所有连接的完整列表。 如果你有很多连接(thouthands等),你可以使用

加快速度
std::multimap<int, int> conncections
.....
// to find all connected points:
std::pair <std::multimap<int,int>::iterator, std::multimap<int,int>::iterator> ret;
ret = conncections.equal_range(ch);