Wskaźnik na elementy wektora

Odpowiedz Nowy wątek
Asked
2011-05-15 17:41
Asked
0

Witam, do funkcji przekazuję wskaźnik na wektora załóżmy, że tak wygląda funkcja:

void Funkcja(std::vector<typ>* wektorek)

No ale mam w nim różne dane i chce je rozdzielić więc tworzę sobie wektora gdzie filtruje dane i je do niego wrzucam i operując na tym lokalnym wektorze chciałbym aby zmieniały się dane w oryginalnym(tym który jest przekazywany do funkcji), jak mogę to osiągnąć?

Pozostało 580 znaków

2011-05-15 17:56

Rejestracja: 11 lat temu

Ostatnio: 5 lat temu

0

Raczej to będzie std::vector<typ*> wektorek


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

adad
2011-05-15 18:00
adad
0

A to nie będzie wtedy wektor wskaźników na typ?

Pozostało 580 znaków

2011-05-15 18:07

Rejestracja: 8 lat temu

Ostatnio: 5 dni temu

0

Nie potrzebujesz tworzyć kopii lokalnej w funkcji, działasz na tej którą przekazałeś w argumencie. Jako, że to wskaźnik to kopia z maina też się zmieni :] Czyli np.:

void Funkcja(vector<int>* wektorek)
{
wektorek->at(6)=0;
}

Pozostało 580 znaków

adad
2011-05-15 18:08
adad
0

To wiem, ale mi chodzi o coś innego.

W funkcji robię drugi wektor do którego FILTRUJE dane z tego głównego wektora i chce aby przez zmianę danych w tym drugim wektorze również zmieniały się dane w tym głównym.

Pozostało 580 znaków

2011-05-15 18:28

Rejestracja: 9 lat temu

Ostatnio: 2 lata temu

0

Więc ten drugi wektor deklarujesz tak: vector<Typ*> drugiWektor i wrzucasz do niego wskaźniki do elementów, które przechodzą przez Twój filtr. Teraz operując na tym drugim, operujesz na wskaźnikach do elementów w pierwszym, więc zmieniasz to co siedzi w pierwszym. Przy okazji oszczędzasz pamięć, bo nie kopiujesz niepotrzebnie elementów z pierwszego do drugiego.


Pozostało 580 znaków

waaaa
2011-05-15 18:31
waaaa
0

Dokładnie to chce osiągnąć ale nie wiem jak zrzutować to w push_backu bo cały czas kompilator mi rzuca błędy.

Pozostało 580 znaków

2011-05-15 18:33

Rejestracja: 9 lat temu

Ostatnio: 2 lata temu

0
drugiWektor.push_back(&oryginalnyWektor.at(xxx));

edytowany 1x, ostatnio: byku_guzio, 2011-05-15 18:34

Pozostało 580 znaków

wqqq
2011-05-15 18:36
wqqq
0

Uhm, metoda get?

Mam takie cuś:

void Oglos_Wydarzenie(std::vector<wydarzenie> zmienna)
{
std::vector<Wydarzenie
> obecne;
obecne.push_back((&zmienna)[i]);
}

Oczywiście jest tam też inny kod ale nei jest on potrzebny więc nie kopiuje.

już poprawiłem, pomyliły mi się kontenery z Javy ;) - byku_guzio 2011-05-15 19:40

Pozostało 580 znaków

2011-05-15 18:36

Rejestracja: 8 lat temu

Ostatnio: 7 lat temu

0

Jesli wektor ktory filtrujesz zawiera wskazniki do obiektow struktur itp to wrzuc do tego wektora drugiego te wskazniki i bedziesz na nich operowac bo wciaz beda one wskazywaly na te same obiekty np:


typedef tagTOsoba
{
    string imie;
    int wiek;
} TOsoba

typedef TOsoba *LPOSOBA;     //  << masz zdefiniowany wskaznik na typ TOsoba

//teraz tworzysz typ wektora

typedef vector<LPOSOBA> TVecOsoby;

//teraz definiujesz wskaznik do typu TVecOsoby

typedef TVecOsoby *LPVOSOBY;

//teraz w programie deklarujesz wektor osob;

TVecOsoby vOsoby;

//teraz tworzysz osobe

LPOSOBA osoba = new TOsoba();
osoba->imie = "adam";
osoba->wiek = 12;

vOsoby.push_back(osoba);            //  << wrzucasz do pojemnika

//teraz wywolujesz funkcje filtrujaca

void filtruj(&vOsoby);

void filtruj(LPVOSOBY lpOsoby)
{
    // tu robisz co chcesz
    //deklarujesz inny wektor
    TVecOsoby drugiWektor;

    // i powiedzmy filtrujesz
    vector<LPOSOBA>::iterator i;
    for(i = lpOsoby->begin();i!=lpOsoby->end();i++)
    {
          // wrzucasz np wszystkich adamow do drugiego
          if( (*i)->imie == "adam" )
             drugiWektor.push_back((*i));
    }

/*    i robisz dalej co chcesz z drugim wektorem, i chocbys nie wiem co zrobil z tym wektorem gdzie go przekazal lub do jakiej funkcji wyslal, nadal bedziesz operujac na drugim tak naprawde operowal na pierwszym, tzn na obiektach w nim, bo w wektorach sa tylko adresy do obiektow ktore sa w jakims miejscu w pamieci !!*/
}

//Oczywiscie na koniec nie zapomnij zwolnic miejsca czyli..
vector<LPOSOBA>::iterator i;
for(i = vOsoby.begin();i!=vOsoby.end();i++)
{
          delete (*i);
}
vOsoby.clear();

Pozdro


edytowany 2x, ostatnio: kwasek2000, 2011-05-19 14:02

Pozostało 580 znaków

adada
2011-05-15 18:42
adada
0

Nie da się tego jakoś łatwiej załatwić, chce po prostu zmienić jedno pole w strukturze bo tylko to zmienić potrzebuje, mógłbym szukać po ID w oryginalnym wektorze ale bez sensu to jest bo jeśli mam 100 struktur a potrzebuje zmienić tylko jedna....

Pozostało 580 znaków

Odpowiedz

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