• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funktor predefiniowany i operacja dodawania

Object Storage Arubacloud
+1 głos
104 wizyt
pytanie zadane 25 maja 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)

Cześć, 

mam zbiór liczb:

set<double> a();
    a.insert(5);
    a.insert(6);
    a.insert(1);

Chcę przy użyciu funkcji transform do każdego z  elementów zbioru, dodać pewną wartość, niestety żadne z rozwiązań poniżej nie działa. 


ostream_iterator<int,char> out(cout,", ");
    transform(a.begin(),a.end(),out,plus<int>(2));

//albo

ostream_iterator<int,char> out(cout,", ");
    transform(a.begin(),a.end(),out,bind1st(plus<int>(),2));

Jak mogę rozwiązać problem? 

 

PS

Jeżeli mam klasę, to czy jest możliwość deklaracji iteratora: 

ostream_iterator<int,char> out(cout,", ");

,w sekcji publicznej, tak aby w każdej metodzie klasy nie trzeba było go od nowa definiować? 

1 odpowiedź

+1 głos
odpowiedź 25 maja 2020 przez Piotr Batko Stary wyjadacz (13,190 p.)
wybrane 25 maja 2020 przez amtrax
 
Najlepsza

Jak nie działa, jak działa? :)
https://godbolt.org/z/oJkzPU

Jest możliwość, nawet nie trzeba w sekcji publicznej:
https://godbolt.org/z/mCPMf_

komentarz 25 maja 2020 przez amtrax Dyskutant (9,630 p.)

Dziękuje Ci za odpowiedź, std:: robi znaczącą różnicę :D

 

Mam jeszcze jedno pytanie:

set<double>p()
{
    set<double> r;
     transform(set1.begin(),set1.end(),r,bind1st(std::plus<double>(),2.5)); //dlaczego tutaj wyrzuca blad?
    return r;
}

Chcę dodać do istniejącego zbioru liczbę, następnie wynik przekopiować do nowego zbioru i zwrócić go. 

błąd: 

error: assignment of read-only location '__result.std::_Rb_tree_const_iterator<_Tp>::operator*<double>()'|

 

2
komentarz 25 maja 2020 przez Piotr Batko Stary wyjadacz (13,190 p.)

Bardzo proszę :)

Możesz to zrobić tak:
https://godbolt.org/z/J2AQ4Z

Zajrzyj sobie do dokumentacji std::transform. Jak przejedziesz trochę niżej, do "Possible implementation", to zobaczysz jak to może być zaimplementowane. Zwróć uwagę, że z trzecim argumentem (podałeś mu tam std::set, r) on będzie próbował robić inkrementację, dereferencję i przypisanie pojedynczego elementu. Tego się z std::setem nie da zrobić. Powyższe wyjaśnienie nie odpowiada błędowi jaki wkleiłeś. Szczerze mówiąc nie wiem czego on dotyczył, ale na pewno był duży problem z tym trzecim argumentem ;)

Podobne pytania

+1 głos
2 odpowiedzi 246 wizyt
pytanie zadane 7 stycznia 2016 w C# przez Mateusz Tocha Bywalec (2,560 p.)
0 głosów
1 odpowiedź 187 wizyt
pytanie zadane 18 marca 2021 w C i C++ przez Adamek185wp Obywatel (1,280 p.)
0 głosów
1 odpowiedź 2,390 wizyt
pytanie zadane 21 czerwca 2017 w JavaScript przez crova Użytkownik (940 p.)

92,539 zapytań

141,382 odpowiedzi

319,479 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...