2014-12-04 53 views
1

我試圖做到這一點:向量與身份證號碼的對象和連接的

我想有一個向量(的std ::向量),像這樣定義的對象:

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 &連接)如果矢量的結構被修改(例如元素6被設置爲4並且4被設置爲6,則對象改變它們的ID,並且如果5被連接,則4與6連接)。我接受所有類型的解決方案,如果他們值得的話。我想了很多,但我找不到解決方案。

我希望我很清楚。謝謝!

+1

加快步伐可能一個對象連接到其他幾個對象?你需要雙向參考(5 - > 7,7 - > 5)還是隻有一個方向(5 - > 7)? – 2014-12-04 10:16:50

+0

雙向引用,是的一個對象可以連接幾個ebjects! – 2014-12-04 10:20:05

+1

您的約束條件太緊張,您的要求太短。您將無法將有效的指針或迭代器存儲到向量的元素中(除非您保證此向量永遠不會增長),我也不會建議嘗試這樣做。你不能存儲索引?或者其他一些獨特的索引?然後使用地圖而不是矢量?所有相當腥...... – 2014-12-04 10:30:42

回答

0

您可以使用這樣

map<yourcommonthing, vector<MyObj>> yourMap; 

那麼什麼都是有您可以將常見的東西通過該MyObj中,這也是地圖的關鍵。

如果是的ID號,然後一個或多個MyObj中之間共同的,

map<idNumber, vector<MyObj>> vectorOfObj; 
0

你的描述告訴我,你很可能尋找一個圖形表示。

你可以在這裏使用升壓圖:

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) 
+0

http://meta.stackoverflow.com/a/271102/560648 – 2014-12-04 10:53:55

0

所以,你必須經常Graph。 有兩種主要的方式,你可以存儲你的referenses:

在我看來,它是使用edjes的列表simpliest解決方案,

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); 
+0

ch是什麼? – 2014-12-05 09:49:20