Ошибка компоновки вектора C ++:

0

Итак, у меня есть этот код:

#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")

Почему это?

Теги:
vector
addition

4 ответа

2

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. На данный момент он рухнет.

  • 0
    Это работает сейчас, но не могли бы вы объяснить мне, как это работает?
  • 0
    Я отредактирую сообщение, чтобы оно было более наглядным.
0

вы должны изменить свой код на это:

 #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.

0

Почему вы не печатаете содержимое 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;
}
  • 0
    Плохая практика Сума имеет одну работу. Другая функция может печатать. Вы добавляете побочные эффекты к функции. Особенно плохо вводить очень медленную операцию, такую как IO, в математическую функцию, которая может потребоваться для быстрого выполнения.
  • 0
    Договорились @KennyOstrom. Отредактированный ответ.
-1

Там нет определения того, как излучать вектор в выходной поток.

Вероятно, вы должны определить функцию, чтобы превратить вектор ints в строку, а затем вызвать

cout<< YourPrintFunction(suma(a,b)) <<endl;
  • 0
    да, но с функцией все в порядке?
  • 0
    Нет. Вам нужно сдвинуть элементы обратно в sumat или изменить их размер, прежде чем использовать operator []. Также вам нужно проверить, что t и m имеют одинаковый размер или перечисляются только в пределах меньшего.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню