Итак, у меня есть этот код:
#include <iostream>
#include <vector>
using namespace std;
vector <int> suma(vector <int> t, vector <int> m){
int i;
vector <int> sumat;
for(i=0; i<t.size();i++){
sumat[i]=t[i]+m[i];
}
return sumat;
}
int main(){
vector <int> a(4,0);
a[0]=5;
a[1]=5;
a[2]=3;
a[3]=0;
vector <int> b(4,0);
b[0]=5;
b[1]=5;
b[2]=3;
b[3]=0;
cout<< suma(a,b) <<endl;
}
И это ошибка comp, которую я получаю в последней строке cout:
[Ошибка] не соответствует "operator <<" (типы операндов: "std :: ostream {aka std :: basic_ostream}" и "std :: vector")
Почему это?
C++ не определяет операционный operator <<
для векторов, скорее всего, потому что существует много разных способов их вывода. Одна запись на строку, как показано ниже, или разделенная запятой или содержащаяся в скобках.
Вы можете определить свой собственный оператор <<
для векторов, используя "перегрузку оператора". Это позволяет одному и тому же оператору вызывать другой код в зависимости от вызывающих параметров.
Глобальные методы перегрузки операторов имеют специальное соглашение о вызове, первый параметр - это ссылка на объект слева от оператора (например, cout
в cout << v
, второй параметр - значение справа от оператора (v
). Для оператора <<
вы обычно определяете параметр как константную ссылку, так как вы обычно не меняете значение при его выходе.
Возвращаемое значение для оператора <<
обычно является первым параметром. Это позволяет вам подключать вызовы к <<
как cout << vec << "Done" << std::endl
.
например:
ostream &operator << (ostream &out, const vector<int> &vec)
{
for (auto &&val : vec)
out << val << std::endl;
return out;
}
Если вы не можете использовать C++ 11, вы можете использовать более старый стиль:
ostream &operator << (ostream &out, const vector<int> &vec)
{
for (vector<int>::size_type i = 0; i < vec.size(); i++)
out << vec[i] << std::endl;
return out;
}
или других подобных петель с использованием итераторов.
PS. Несвязанное примечание - вам нужно инициализировать размер sumat
в вашем коде или использовать push_back
. На данный момент он рухнет.
вы должны изменить свой код на это:
#include <iostream>
#include <vector>
using namespace std;
vector<int> suma(vector<int> t, vector<int> m){
int i;
vector<int> sumat(4);
for(i=0; i<t.size();i++){
sumat[i]=t[i]+m[i];
}
return sumat;
}
int main(){
vector<int> a(4,0);
a[0]=5;
a[1]=5;
a[2]=3;
a[3]=0;
vector<int> b(4,0);
b[0]=5;
b[1]=5;
b[2]=3;
b[3]=0;
vector<int> res = suma(a,b);
for(size_t i = 0; i<res.size(); i++)
cout<<res[i]<<endl;
}
В вашем коде есть некоторые ошибки: (1) вы должны зарезервировать ограничение для векторного sumat
при использовании sumat[i]
. vector<int> sumat
просто vector<int> sumat
вектор, если вы хотите вставить значение в sumat
, вы можете использовать push_back
.
(2) вы не можете напрямую cout
на vector
объект, вы можете написать оператор переопределения для vector
объекта или вывести элемент для vector
.
Почему вы не печатаете содержимое sumat в функции suma, как это
void suma(vector <int>& t, vector <int>& m, vector<int>& output){
// Assuming that both vectors t and m are of the same size.
for(size_t i=0;i<t.size();i++){
output.push_back([i]+m[i]);
}
}
Обратите внимание, что я изменил возвращаемое значение функции из вектора в void. Затем в вашей основной функции вы можете вызвать функцию, подобную этой.
vector<int> sumat;
suma(a, b, sumat);
Затем вы можете продолжить и распечатать вывод вашего символа sumat следующим образом:
for(size_t i = 0; i < sumat.size(); ++i)
{
cout << sumat[i] << endl;
}
Там нет определения того, как излучать вектор в выходной поток.
Вероятно, вы должны определить функцию, чтобы превратить вектор ints в строку, а затем вызвать
cout<< YourPrintFunction(suma(a,b)) <<endl;
t
и m
имеют одинаковый размер или перечисляются только в пределах меньшего.