Wskaźnik na elementy wektora

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ąć?

0

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

0

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

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;
}
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.

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.

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.

0
drugiWektor.push_back(&oryginalnyWektor.at(xxx));
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 nie jest on potrzebny więc nie kopiuje.

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

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....

0

Oryginalny wektor nie ma wskaźników tylko zwykłe obiekty.

0

Napisz se funkcje zwracajaca ci wskaznik do obiektu o podanym id czyli to co bylo wczesniej plus to

LPOSOBA lpKtos = get_osoba_by_id(45);
if(lpKtos)
{
lpKtos->imie = "bolek";
}

LPOSOBA get_osoba_by_id(int id_osoby)
{
//wektor moze byc globalnie zadeklarowany albo mozesz go przekzac do funkcji (jego wskaznik)
vector<LPOSOBA>::iterator i;
for(i = vOsoby.begin(); i != vOsoby.end(); i++)
{
if( (*i)->id == id_osoby ) return (*i);
}
}

100 struktur to nie duzo, tak by bylo elegancko i moze by ci sie przydala ta funkcja w przyszlosci, ale jak kolega zauwazyl mozesz uzyc vOsoby.at(...) bedzie szybciej na pewno

0

Jesli zwykle obiekty to musisz je iterowac..

0

Już działa:
void Oglos_Wydarzenie(std::vector<Wydarzenie>& zmienna)
{
std::vector<Wydarzenie*> obecne;
obecne.push_back(&zmienna[i]);
std::cout << obecne.size() << std::endl;
obecne[0]->tytul = "Zmienione";
}

Tak czy siak chciałbym Wam podziękować za pomoc.

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