벡터

2014-12-04 6 views
1

내가 그렇게하려고 해요 :벡터

I는 다음과 같이 정의 된 객체와 벡터 (표준 : : 벡터)를 가지고 싶다 : 그래서

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) 만 필요합니까? –

+0

양방향 참조 및 예 한 객체가 여러 객체와 연결될 수 있습니다! –

+1

제약 조건이 너무 빡빡하고 요구 사항이 너무 짧습니다.벡터에 대한 요소에 유효한 포인터 나 반복자를 저장할 수는 없습니다. (벡터가 그 이후에 결코 커지지 않는다는 것을 보장하지 않는 한) 나는 그렇게하려고 시도조차 권하지 않습니다. 색인을 저장할 수 없습니까? 아니면 어떤 종류의 고유 색인입니까? 그런 다음 벡터 대신지도를 사용 하시겠습니까? 모두 꽤 생선 ... –

답변

0

또한지도의 핵심입니다으로 당신이 그룹을 할 수있는 일반적인 일이있는 모든하여 MyObj 무엇 그래서이

map<yourcommonthing, vector<MyObj>> yourMap; 

처럼 사용할 수 있습니다.

idNumber가 하나 개 이상의하여 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 –

0

그래서, 당신은 정기적 Graph 있습니다. 당신이 당신의 referenses를 저장할 수있는 2 개 가지 방법이 있습니다 : 별도의 벡터의 모든 edjes의

이 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

'채널'이란 무엇입니까? –