使用qt在向量中查找重复项

时间:2016-08-08 06:31:09

标签: c++ qt csv

我有一个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作为键,但我不确定这是否是正确的方法。 有人可以让我知道其他任何方式。

2 个答案:

答案 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。