Поиск по векторам пар - PullRequest
       4

Поиск по векторам пар

0 голосов
/ 19 апреля 2020

У меня есть двумерный вектор пар, и я хотел бы получить, в какой строке находится данная пара.

Я пытался перебрать все элементы, но мне это не удалось.

Вот матрица смежности неориентированного взвешенного графа:

vector<pair<int,int >> adj[20];
    for (int i = 1; i <= nodes; i++){
        f >> x >> y >> weight;

        adj[x].push_back(make_pair(weight, y));
        adj[y].push_back(make_pair(weight, x));
    }

И это выглядит примерно так:

(4,2), (5,3)

(4,1), (6,3)

(5,1), (6,2)

Я пытаюсь найти, в какой строке находится пара (6, 2)

typedef pair<int, int>p;
p pair= make_pair(6, 2);
cout << which_row(adj, pair);

Вот что я попробовал в первую очередь:

int which_row(vector<p>adj[20], p pair) {
    vector <pair<int, int>> ::iterator it;

    for (int i = 0; i < adj->size(); i++) {
        for (int j = 0; j < adj[i].size(); i++) 
            if (pair.first == adj[i][j].first && pair.second == adj[i][j].second)
                return i;
    }
    return -1;
}

, но он не вступает в силу в течение l oop.

Секунда:

int which_row(vector<p>adj[20], p pair) {
    vector <pair<int, int>> ::iterator it;

    for (int i = 0; i <= adj->size(); i++) {
        for (it = adj[i].begin(); it != adj[i].end(); it++)
            if (pair.first == it->first && pair.second == it->second)
                return i;
    }

}

Но это не шаг за секунду для l oop.

Что я могу сделать?

1 Ответ

0 голосов
/ 19 апреля 2020

Поскольку мы можем вывести ваши x и y входные данные из пар, которые вы нам дали, вы никогда не набросите sh ничего в adj[0]. adj->size() совпадает с adj[0].size(). Вы никогда ничего не толкали в это, так что это будет 0. Кажется, вы хотите go в каждом ряду? Каждая строка содержит вектор? Каждый вектор содержит несколько пар? Сделайте adj a vector<vector<pair<int, int>>>, чтобы вы могли получить доступ к adj.size(). Это скорее всего то, что вы хотите. Или выполните итерацию от i = 0; i < 20; i++ до go по каждой строке.

Измените свою итерацию на:

int which_row(vector<p>adj[20], p pair) {
    for (int i = 0; i < 20; i++) { // <-- changed to < 20 (not <= 20)
        for (auto it = adj[i].begin(); it != adj[i].end(); it++)
            if (pair == *it) // <-- pairs compare as you'd expect, no need to compare each element
                return i;
    }

    return -1; // need to return something if not found
}

Или мы можем воспользоваться std::find в библиотеке <algorithm>:

#include <algorithm>

int which_row(vector<p>adj[20], p pair) {
    for (int i = 0; i < 20; i++) { // <-- changed to < 20 (not <= 20)
        if (std::find(adj[i].begin(), adj[i].end(), pair) != adj[i].end())
            return i;
    }

    return -1; // need to return something if not found
}

Если вы измените инициализацию adj на std::vector<std::vector<p>> adj(20);, вы можете изменить which_row на:

// in main or whatever:
// makes a vector of 20 default-initialized (empty) vector<p>
std::vector<std::vector<p>> adj(20);

// elsewhere:
int which_row(vector<vector<p>> adj, p pair) {
    for (auto i = 0; i < adj.size(); i++) { // <-- adj is a vector now
        if (std::find(adj[i].begin(), adj[i].end(), pair) != adj[i].end())
            return i;
        }
    }

    return -1; // need to return something if not found
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...