我有一个csv文件,其内容如下所示:
Source Target LinkId LinkName Throughput
==================================================
1 12 1250 link1250 5
1 12 3250 link3250 14
1 14 1250 link1250 5
1 14 3250 link3250 14
1 18 1250 link1250 5
1 18 3250 link3250 14
2 12 2250 link2250 5
2 12 5250 link5250 14
2 14 2250 link2250 5
2 14 5250 link5250 14
2 18 2250 link2250 5
2 18 5250 link5250 14
等等。 目标是找到从每个源节点多播的链接数,即对于源1,目标是12,14,18用于linkID 1250,对于linkID 3250,对于源1,目标是12,14, 18等等。
我一直在使用Qt,并将csv读入结构的向量,如下所示:
struct edgeDetails_t{
int source;
int target;
int linkID;
QString linkName;
int throughput;
};
QVector<edgeDetails_t> multiCastLinks;
为了达到上述目标,我尝试使用QHash
QHash<int, QList<int>> multiCastSenders;
以source作为键,但我不确定这是否是正确的方法。 有人可以让我知道其他任何方式。
答案 0 :(得分:4)
这也可以通过允许多个键的QMultiMap实现,然后您可以使用方法keys()
来获取密钥,values(key)
来获取相应的值。
要删除重复的值,您可以使用toSet()
,它只返回相应列表的唯一值。
QMultiMap<int, int> test;
test.insert(1, 12);
test.insert(1, 12);
test.insert(1, 12);
test.insert(1, 14);
test.insert(1, 18);
test.insert(1, 18);
test.insert(2, 12);
test.insert(2, 12);
test.insert(2, 12);
test.insert(2, 14);
test.insert(2, 18);
test.insert(2, 18);
qDebug() << "size:" << test.size();
QSet<int>::iterator it;
QSet<int> keys = test.keys().toSet();
qDebug() << "keys:" << keys;
for(it = keys.begin(); it != keys.end(); ++it) {
qDebug() << "key:" << *it << "value:" << test.values(*it).toSet();
}
输出:
size: 12
keys: QSet(1, 2)
key: 1 value: QSet(12, 14, 18)
key: 2 value: QSet(12, 14, 18)
你可以用你的酷结构来弄清楚其余部分。
HTH
答案 1 :(得分:2)
struct edgeDetails_t{
int linkID;
QString linkName;
int throughput;
}
struct sourceNode_t {
int sourceNodeId; // For give source node
QMap<int, int> targetNodeIdList; // Map link ID -> Target node ID
};
QMap<int, sourceNode_t> sourceNodeList; // All source nodes. Map node ID -> Node object
QMap<int, edgeDetails_t> edgeList; // All edges. Map edge ID -> Edge object
对于给定源节点ID,您可以轻松找到节点对象,从那里您可以迭代所有唯一链接并获取目标节点ID。