Давайте представим, что в массив хранятся некоторые данные, которые должны пройти через функцию, которая принимает вектор. В этой ситуации, очевидно, данные массива должны быть преобразованы в соответствующий векторный тип. Одним общим подходом будетПреобразование массивов в векторы внутри аргумента функции
std::vector<int> vec(arr, arr+n);
function(vec);
где arr - указанная переменная массива. Я знаю, что мы добавили только одну строку, но она выглядит как ненужное загрязнение кода. Так что я попробовал этот
function(std::vector<int>(arr, arr+n))
, что работал. Ниже приведен подробный код.
#include <vector>
#include <iostream>
void print(std::vector<int> vec){
for(unsigned int i=0; i!=vec.size(); ++i){
std::cout << vec[i] << std::endl;
}
}
int main(){
int a[] = {2,1,4,5,6};
print(std::vector<int>(a,a+5));
}
От этого, мой первый вопрос: этот подход в порядке или у него есть нежелательное поведение?
После этого я решил изменить аргумент функции принять векторную ссылку как
void print(std::vector<int> &vec){
for(unsigned int i=0; i!=vec.size(); ++i){
std::cout << vec[i] << std::endl;
}
}
, что не работает. Здесь ошибка, что я получил
test.cpp: In function ‘int main()’:
test.cpp:13:34: error: invalid initialization of non-const reference of type ‘std::vector<int>&’ from an rvalue of type ‘std::vector<int>’
print(std::vector<int>(a,a+5));
^
test.cpp:4:6: error: in passing argument 1 of ‘void print(std::vector<int>&)’
void print(std::vector<int> &vec){
Вот второй вопрос: почему, когда аргумент функции, как случайно векторной ссылкой этот подход не работает. Есть ли способ обойти эту ошибку компилятора, поддерживая подход к созданию векторного объекта в функции аргумента или нет?
, как говорится в сообщении компилятора, вы должны сделать ссылку 'const' –
почему его нужно быть постоянным? – Randerson
Если это не const, вы можете изменить параметр в функции, что на самом деле не имеет смысла для временного объекта. Это общий вопрос [см. здесь] (http://stackoverflow.com/questions/13826897/why-not-non-const-reference-to-temporary-objects) –