Давайте разберем сообщение об ошибке:
invalid initialization of non-const reference of type ‘std::vector<int>&’ ...
... int val = happiness(n,v);
Это говорит о том, что ваша функция ожидает std::vector<int>&
в вызове функции int val = happiness(n,v)
.
from an rvalue of type ‘std::vector<int>*’
Это говорит вам, чтовы фактически предоставляете, std::vector<int>*
. Это потому, что массивы в стиле c, такие как vector<int> v[10000];
, являются просто указателями. Число в скобках просто указывает компилятору, сколько памяти он должен выделить в стеке, чтобы удовлетворить требования к памяти этого массива. Так что, если вы хотите передать это своей функции, вы можете сделать это несколькими способами. Замена vector<int> &vecvec[]
на vector<int>* vecvec
, вероятно, будет самым быстрым решением.
Однако более подходящим решением вашей проблемы, вероятно, является использование std::vector<std::vector<int>> v;
, как предложено в ответе "lenik", потому что вы можете изменить его размер с помощью v.resize(10000)
и получить текущий размер с помощью v.size()
(Всегда используйте это при цикле по векторным элементам). Вы можете передать его непосредственно вашей функции, используя std::vector<std::vector<int>>&
. Кроме того, вам не нужно передавать num
вашей функции, если вы измените размер массива на введенное вами число:
...
cin >> n;
std::vector<std::vector<int>> v(n);
или
...
cin >> n;
std::vector<std::vector<int>> v;
v.resize(n);
Тогда ваши циклы будут
for(int i=0; i < v.size(); i++){
...
for(int j=0; j < v.size(); j++){
...
}
...
}
В качестве альтернативы, если вы знаете, что ваш массив векторов всегда имеет постоянный размер, вы также можете использовать std::array<std::vector<int>, 10000> v;
(#include <array>
). Это класс-оболочка для массива c-style, который дает вам дополнительные функциональные возможности, такие как сохранение размера массива, который вы можете получить таким же образом, как в std::vector
(v.size()
).
Дополнительное примечание: Нет необходимости передавать num
для ссылки int&
. Фундаментальные типы, такие как int
, float
, double
и т. Д., Всегда должны передаваться по значению, а не по ссылке, если вы не собираетесь изменять их значение внутри функции.