我正在尝试这样做:
我想有一个矢量(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)连接。如果值得,我会接受所有类型的解决方案。我想了很多,但我找不到解决方案。
我希望我很清楚。三江源!
答案 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);