Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przeciążanie operatora dla vector

Ostatnio zmodyfikowano 2017-06-02 10:51
Autor Wiadomość
wokub
Temat założony przez niniejszego użytkownika
Przeciążanie operatora dla vector
» 2017-06-02 10:24:38
Siemka. Mam jedno zadanie do zrobienia i mam problem. Otóż przeciążając operator * dla vector, działa on tylko w przypadku pierwszego wektora. Tutaj kod:
C/C++
#include <iostream>
#include <vector>
#include <climits>

using namespace std;

double operator *( vector < double > v1, vector < double > v2 )
{
    int n = v1.size();
   
    for( int i = 0; i < n; i++ )
         return( v1[ i ] * v2[ i ] ) +( v1[ i + 1 ] * v2[ i + 1 ] );
   
}

int main()
{
   
    vector < double > v;
    v.reserve( 2 );
    v.push_back( 1 );
    v.push_back( 5 );
   
    vector < double > w;
    w.reserve( 2 );
    w.push_back( 2 );
    w.push_back( 5 );
   
    cout << v * w;
    cout << "\n";
   
   
    vector < double > vdwa;
    vdwa.reserve( 4 );
    vdwa.push_back( 4 );
    vdwa.push_back( 2 );
    vdwa.push_back( 4 );
    vdwa.push_back( 3 );
   
    vector < double > wdwa;
    wdwa.reserve( 4 );
    wdwa.push_back( 8 );
    wdwa.push_back( 4 );
    wdwa.push_back( 3 );
    wdwa.push_back( 6 );
   
    cout << wdwa * vdwa;
}

i mam output:
27
40

Nie jestem w stanie stwierdzić dlaczego tak się dzieje, że zawsze liczy mi tylko dwa pierwsze elementy wektora. A, ważna informacja, przeciążenie ma dot. wektora o każdej długości... Bez tego byłoby to za łatwe. Czy ktoś jest w stanie zauważyć błąd w moim kodzie? Z góry byłbym bardzo wdzięczny.
P-161971
Anim
» 2017-06-02 10:44:02
Trochę przedobrzyłeś z operatorem :)

zauważ, że zrobiłeś return w forze, czyli założyłeś, że wykona się jedna pętla :) I Twój operator automatycznie miał przypisanie tylko dwóch obliczeń (dla i=0, oraz dla i = 0 + 1)

Tutaj masz poprawiony operator:

C/C++
#include <iostream>
#include <vector>
#include <climits>

using namespace std;

double operator *( const vector < double > v1, const vector < double > v2 )
{
    int n = v1.size();
    int suma = 0;
    for( int i = 0; i < n; i++ )
         suma +=( v1[ i ] * v2[ i ] );
   
    return suma;
   
}

Mam nadzieję, że widzisz co robiłeś źle :)

Warto pamiętać o słowie "const" w nawiasach :)
P-161976
karambaHZP
» 2017-06-02 10:44:17
Podaj więcej szczegółów. Jakiego spodziewasz się outputa. Na czym miałoby polegać mnożenie vectorów.

Bardzo nieintuicyjne. Mnożenie wektorów zwraca sumę iloczynów poszczególnych elementów.
P-161977
Anim
» 2017-06-02 10:51:18
@karambaHZP Twoje podejście jest chyba bardziej dydaktyczne niż moje :)

@wokub w tym co napisałem jeszcze jest jedno duże ALE: musisz mieć pewność, że przekazujesz wektory o tych samych rozmiarach, w innym wypadku będzie się psuło. Trzeba to zabezpieczyć :)
P-161981
« 1 »
  Strona 1 z 1