我有一些组件的列表,比如ID为1到140。 我有一个excel表,有两列数据如下:
I/p O/p
-------------
38 1
1 5
1 3
76 1
77 1
78 1
79 1
77 2
78 2
79 2
125 126
22 126
23 126
113 127
113 134
113 135
113 136
等等。我在表格中有超过5000行。
我需要计算每个组件连接的组件数。假设组件1可以是输入或输出,我需要找到连接到的组件1的总数。从上面的例子中,1总共连接7个组件,38,5,3,76,77,78,79。
我应该如何使用Qt以编程方式执行此操作?
答案 0 :(得分:1)
从您的示例来看,似乎值的顺序并不重要。例如。一行包含
76 1
似乎与
相同1 76
(至少你想用它做什么)。
最简单似乎是设置一个多图并将所有对添加到它(两次因为顺序不重要)。 E.g。
std::multi_map<int,int> values;
while (reading a line)
{
int firstValue = first value found on line;
int secondValue = second value found on line;
values.insert(std::make_pair(firstValue,secondValue));
}
如果您想知道连接到某个值的所有值,只需在multi_map中查找:
int valueToSearchFor = ...;
auto range = values.equal_range(valuetoSearchFor);
while (range.first!=range.second)
{
std::cout << range.first->second << std::endl;
++range.first;
}
请注意,multi_map可能包含重复项(如果输入文件中出现相同的对)。要解决这个问题,要么在循环范围内构建一个std :: set并跳过之前遇到的值,要么使用以下数据结构:
std::map<int,std::set<int>>
请记住,不同的数据结构会对内存和CPU使用产生不同的影响,因此您可能希望针对自己的特定用途优化数据结构。
如果你还想知道所有间接连接的值,建立一个包含你遇到的所有值的向量,并在循环它时迭代它(并且还使用std :: set来防止使用相同的值并且再次)。 E.g。
std::set<int> alreadyEncounteredValues;
std::vector<int> foundValues;
valueToSearchFor = ...;
foundValues.push_back(valueToSearchFor);
alreadyEncounteredValues.insert(valueToSearchFor);
for (size_t index=0;index<foundValues.size();++index)
{
auto thisValueToSearchFor = foundValues[index];
for (auto range=values.equal_range(thisValueToSearchFor);range.first!=range.second;++range.first)
{
auto foundValue = range.first->second;
auto insertResult = alreadyEncounteredValues.insert(foundValue);
if (!insertResult.second)
{
// We already encountered this value. Skip it.
continue;
}
// New value
foundValues.push_back(foundValue);
}
}
使用此方法,我们在集合中插入所有找到的值(以便于查看我们是否已经遇到该值)和向量中。我们还遍历向量,因此我们也将查找所有间接链接的值。一段时间后,索引将赶上大小,我们知道我们找到了所有间接链接的值。