У меня есть часть кода, которую я переношу из Fortran в C++, и я хотел бы избежать некоторых из вложенных структур цикла, которые мне пришлось создать в исходный код F77.Поиск вхождения векторов в другой вектор без вложенных циклов
Проблема заключается в следующем: у меня есть вектор объектов, называемых узлами, каждый из которых содержит вектор, содержащий (среди других важных сведений) индексы других объектов узла, к которым каждый подключен (граф соединений). Как это
struct Node {
vector<int> conNode;
};
vector<Node> listOfNodes;
vector<int> nodeListA; // a subset of nodes of interest stored as their vector indices
мне нужно искать узлы, узлы в nodeListA подключены, но только если эти узлы также в nodeListA. Прямо сейчас, мой код выглядит примерно так:
// Loop over the subset of node indices
for (int i=0; i<nodeListA.size(); i++) {
// Loop over the nodes connected to the node i
for (int j=0; j<listOfNodes[nodeListA[i]].conNode.size(); j++) {
// Loop over the subset of node indices again
for (int k=0; k<nodeListA.size(); k++) {
// and determine if any of node i's connections are in the subset list
if (nodeListA[k] == listOfNodes[nodeListA[i]].conNode[j]) {
// do stuff here
}
}
}
}
Здесь должен быть гораздо более простой способ сделать это. Похоже, я делаю это слишком сложно. Как я могу упростить этот код, возможно, используя стандартную библиотеку алгоритмов?
Я не знаю, используете ли вы 'nodeListA' для целей, отличных от приведенных здесь. Но если это основная или единственная цель, может быть хорошей идеей использовать 'std :: set' или (C++ 11 или Boost)' std :: unordered_set', а не 'std :: vector 'для этого. Наборы гораздо более подходят для поиска. – jogojapan