Это массив векторов в стиле C, здесь действительно нет ничего волшебного.
int spanningTree(vector <pair<int,int> > g[], int n);
Возможно, вы видели что-то подобное раньше:
int foo( int array[], int n);
В своем коде элементы массива не int
, а std::vector
с. Почему они смешивают простые массивы и std::vector
я не могу вам сказать.
В вашем примере вам нужно сначала использовать operator[]
для доступа к элементу, прежде чем вы сможете получить доступ к его .first
и .second
, или использовать front
для получения первого элемента:
for(int x = 0; x < 2; ++x){
cout << vec[x].front().first << ", " << vec[x].front().second << endl;
}
Я никогда не видел передачи вектора, подобного массиву:
blockquote>vector <pair<int,int> > g[]
Это - массив! Массив векторов.
Проблема с вашим кодом в том, что у вас есть два вектора, оба с одним элементом, и ваш цикл только вытягивает векторы ... а не их единственный элемент.
Ваша версия будет:
#include <iostream> #include <vector> #include <utility> #include <string> using namespace std; int main() { vector< pair<string, int> > vec[2]; vec[0].push_back({"One", 1}); vec[1].push_back({"Two", 2}); for(int x = 0; x < 2; ++x){ cout << vec[x][0].first << ", " << vec[x][0].second << endl; } return 0; }
Все, что я добавил, было
1111 Конечно, такой пример имеет сомнительную практичность. В такой ситуации может показаться, что вы хотите один вектор с двумя элементами и без видимых массивов.[0]
(индекс для каждого вектора).
Если честно, я не в восторге от оригинального кода. Смешивание массивов и векторов - рецепт путаницы ( Гиелло ); они могли бы использовать «2D-векторы» или, что лучше, 1D-вектор с 2D-индексами, наложенными поверх него. Тогда это будет иметь гораздо лучшую локальность кэша.