Wątek przeniesiony 2019-01-02 09:05 z Newbie przez Adam Boduch.

Odejmowanie wektorów

0
class Punkt : public vector<double>
{
public:
    Punkt(int r) : vector<double>(r){};
    Punkt(){};

    friend ostream& operator<<(ostream& os, Punkt& vec);
};
int main()
{
    vector<Punkt> wektor(100);
        Punkt centroid(3);

transform(wektor.begin(), wektor.end(), centroid.begin(), wektor.begin(),
        minus<Punkt>());

return 0;

Cześć, w najmniejszym skrócie w wektorze "wektor" jest 100 wektor typu double o wielkosci 3 np.{12,3,-2.1,4.2} a w wektorze centroid jest bardzo podobnie tylko ze jest to jeden wektor. I teraz pytanie w jakis sposób mogę z tego wektoru "wektor" w ktorym jest te 100 wektorow odjac wartosci elementow od elementow ktore sa w wektorze centroid? Próbowalem transformem jak wyzej ale dostaje "vector iterator + offset out of range". Probowalem jeszcze zrobic tą lambdą:

transform(wektor.begin(), wektor.end(), centroid.begin(), wektor.begin(),
        [](Punkt a, Punkt b){return a + b; });

ale również lipa :/ Aha..nie moge uzywac zadnych pętli,tylko algorytmy z stl.

1

Masz vector<double> czy vector<Punkt>? Piszesz o jednym, a w kodzie masz drugie. std::transform oczekuje funkcji przyjmującej jeden argument (transformowany element), więc o co chodzi z drugim? centroid.begin() to zupełnie jakiś bezsens, co to w ogóle miałoby znaczyć?

Powinieneś zrobić mniej więcej tak. Zdefiniuj operację odejmowania dla swojej klasy:

Punkt operator-(Punkt l, Punkt const& r)
{
    // ...
}

(więcej: https://dsp.krzaq.cc/post/304[...]wac-operatory-w-mojej-klasie/ )

A potem go użyj:

transform(wektor.begin(), wektor.end(), wektor.begin(), [&](Punkt const& p){ return p-centroid; });
2
kq napisał(a):

std::transform oczekuje funkcji przyjmującej jeden argument (transformowany element), więc o co chodzi z drugim? centroid.begin() to zupełnie jakiś bezsens, co to w ogóle miałoby znaczyć?

W tym przypadku to się nie sprawdzi, ale jest przeładowanie dla transform w którym można podać dodatkowy iterator i wtedy predykat przyjmuje dwa argumenty. (choć przyznam, że jeszcze nigdy z tego nie korzystałem :P)

template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation >
OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2, 
                    OutputIt d_first, BinaryOperation binary_op );

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0