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

funkcja for_each z kontenerem vector

Object Storage Arubacloud
0 głosów
106 wizyt
pytanie zadane 17 maja 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)
edycja 17 maja 2020 przez amtrax

Cześć, 

mam taką klasę:

class KlientVector
{

 private:
  
     vector<int> otwarte_pozycje;

 public:
    KlientVector(int tab [],int ile );
    void sh();
    void show(int x){cout<<x<<endl;}



};

Konstruktor i funkcja sh

KlientVector::KlientVector(int tab[], int ile)
{
   
    
    copy(pos,pos+ile,insert_iterator<vector<int> > (otwarte_pozycje,otwarte_pozycje.begin()));

}

void KlientVector::sh()
{
    for_each(otwarte_pozycje.begin(),otwarte_pozycje.end(),show);
}

Chcę, żeby w funkcji sh, były pokazywane wartości poprzez  for_each.  Kompilator wyrzuca

error: must use '.*' or '->*' to call pointer-to-member function in '__f (...)', e.g. '(... ->* __f) (...)'|

Nie rozumiem w czym mam błąd. 

PS

Czy istnieje metoda w bibliotece STL, która zwraca miejsce wystąpienia danej wartości, np. 3 czy 4 od początku? 

Pozdrawiam 

1
komentarz 17 maja 2020 przez tkz Nałogowiec (42,000 p.)

for_each oczekuje, że moduł będzie klasą obiektu, który ma operator wywołania, taki jak wskaźnik funkcji lub obiekt funktora. Masz 2(mi znane) opcje, static z std::bind, lambda(moim zdaniem najlepsze rozwiązanie). 

https://en.cppreference.com/w/cpp/algorithm co do drugiego pytania. 

1 odpowiedź

+1 głos
odpowiedź 17 maja 2020 przez EvelekCpp Nowicjusz (200 p.)

Przedstawiam trzy sposoby, jeden to użycie funkcji std::bind(...), drugie przy użyciu wyrażenia lambda oraz trzecie z wykorzystaniem operator(). Odpowiadając na drugie pytanie, jest to funkcja np. find(...).

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

struct PrintValue {
    void operator()(int val) {
        cout << val << '\n';
    }
};

class VectorClient
{
    vector<int> vec;
public:
    VectorClient(const vector<int>& vec) : vec{ vec } { }
    void sh() {
        for_each(vec.begin(), vec.end(), std::bind(&VectorClient::show, this, std::placeholders::_1));
    }
    void sh2() {
        for_each(vec.begin(), vec.end(), [](int val) {
            cout << val << '\n';
        });
    }
    void sh3() {
        for_each(vec.begin(), vec.end(), PrintValue{});
    }
    void show(int x) {
        cout << x << '\n';;
    }
};

int main() {
    VectorClient client{ vector<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } };
    client.sh();
    client.sh2();
    client.sh3();
}

 

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

Dziękuje Ci za odpowiedź,

czy funkcja find() zwróci mi indeks, gdzie taki element sie znajduje?

Taki kod: 

vector<int> a;

a.push_back(3);
a.push_back(2);
a.push_back(1);


auto pd  =  find(a.begin(),a.end(),1);

cout<<*pd; // pokaże mi znalezioną pozycję czyli "1",
//  czy jest opcja aby dana funkcja wyświetlił indeks tej liczby? Czyli w tym przypadku 2? 
 

Pozdrowienia 

1
komentarz 18 maja 2020 przez EvelekCpp Nowicjusz (200 p.)
vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);

auto pos = find(vec.begin(), vec.end(), 30);
if (pos != vec.end()) {
    cout << "index: " << distance(vec.begin(), pos) << '\n';
    cout << "value: " << *pos << '\n';
}

 

Podobne pytania

0 głosów
1 odpowiedź 73 wizyt
pytanie zadane 7 listopada 2020 w C i C++ przez TOWaD Mądrala (5,700 p.)
0 głosów
1 odpowiedź 103 wizyt
pytanie zadane 12 sierpnia 2019 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 118 wizyt
pytanie zadane 1 kwietnia 2017 w C i C++ przez krzakurts Obywatel (1,470 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...