Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[STL] Przekazanie wektora wskaźników do funkcji.

Ostatnio zmodyfikowano 2016-01-31 20:03
Autor Wiadomość
hit
Temat założony przez niniejszego użytkownika
[STL] Przekazanie wektora wskaźników do funkcji.
» 2016-01-27 19:03:19
Witam,

chciałem zapytać co może być nie tak, w przekazanym wektorze. Otóż mam to zrobione w taki sposób:
C/C++
struct S1
{
    string imie;
    string nazwisko;
    string opis;
};

potem wew. main:
C/C++
vector < S1 *> klasa;
wczytaj( klasa );

i dalej:
C/C++
void wczytaj( vector < S1 *> & tab ) {...}

Użyłem wskaźników, ponieważ wydawało mi się to szybsze przy dużej ilości rekordów. Jednak problem w tym, że nie działa mi to jako referencja. Po zakończeniu metody wczytywania wektor klasa jest pusty. W czym problem?

Edit:

Dodam jeszcze, że próbowałem też ten wektor tworzyć globalnie, żeby go nie przekazywać do tej metody i niestety efekt jest taki sam.
P-144074
carlosmay
» 2016-01-27 19:42:04
Użyłem wskaźników, ponieważ wydawało mi się to szybsze przy dużej ilości rekordów.
Kontenery STL stworzone są do maksymalnej wydajności, więc nie wiem czy stosowanie wskaźników jakoś znacząco zmieni szybkość programu dla dużej liczby rekordów.

Wracając do problemu, to nie wiadomo co ty tam robisz z tym kontenerem i strukturą w funkcji wczytaj().
Domyślam się, że wypełniasz wektor wskaźnikami. Te wskaźniki muszą być aktualne póki korzysta z nich kontener,
czyli dla każdego obiektu tworzysz nowy wskaźnik i go nie zwalniasz póki kontener żyje. Operator
new
 w tym przypadku jest problematyczny.

Możesz skorzystać z std::shared_ptr<>.

std::shared_ptr cplusplus
std::shared_prt cppreference
std::shared_ptr cpp0x
P-144076
hit
Temat założony przez niniejszego użytkownika
» 2016-01-28 09:00:50
Czyli jak zrezygnuję ze wskaźników (tak miałem pierwotnie) to będę mógł normalnie użyć referencji i wydajność powinna być w porządku? Z tego co zauważyłem to czas trochę się poprawił (ponad 150 tys. rekordów).

Jednak problem wydajnościowy jaki mnie potem spotkał to łączenie danych z dwóch wektorów - zagnieżdżona pętla for. Trwało to kilkanaście minut i się nie skończyło ale może w takim razie problem tkwił w czymś innym. Sprawdzę jak będę w domu.
P-144098
carlosmay
» 2016-01-28 09:59:08
Przez referencję przekazujesz adres nie kopię.
Założeniem STL jest maksymalna wydajność.
Kontenery różnią się od siebie możliwościami i trzeba dopasować odpowiednio do potrzeb.
P-144099
hit
Temat założony przez niniejszego użytkownika
» 2016-01-30 17:15:26
Powróciłem do pierwotnej wersji czyli zwykły wektor vector <S1> klasa i teraz jak wczytam cały ( ok. 180 tys. rekordów ) i chcę to połączyć z danymi z innego wektora czyli tak jak wspomniałem wcześniej mam zagnieżdżone pętle for to trwa to niesamowicie długo - jakieś tylko 200 rekordów/s.

Mam coś takiego:

C/C++
Zestaw * temp = new Zestaw;
for( size_t i = 0; i < klasa.size(); i++ )
{
    ...
    for( size_t j = 0; j < slownik.size(); j++ )
    {
        if( klasa[ i ].nazwisko == slownik[ j ].nazwisko )
        {
            temp->kod = slownik[ j ].grupa;
            temp->typ = slownik[ j ].typ;
            temp->opis = slownik[ j ].opis;
            break;
        }
    }
    tab.push_back( * temp );
   
}

Czy można to jakoś inaczej przyspieszyć? Analogiczny kod (+ robi jeszcze inne zestawy) w C# wykonuje się w niecałe 2s.
P-144184
pekfos
» 2016-01-30 17:24:19
Słownik powinien być mapą, a nie wektorem, jeśli służy głównie do wyszukiwania, a nawet jeśli musi być wektorem z jakiegoś powodu, to chociaż wyszukuj z głową, a nie najwolniej jak się da. Dodatkowo, zarezerwuj pamięć dla wektorów klasa i tab, oraz usuń alokacje dla Zestaw, bo nie wygląda na potrzebną.
P-144186
hit
Temat założony przez niniejszego użytkownika
» 2016-01-30 17:28:13
pekfos, ale jeśli rozmiar tego pliku ma być zmienny to jaką ilość pamięci powinienem wg Ciebie zarezerwować?

Edit:
No a co do wyszukiwania to właśnie szukam jakiejś podpowiedzi.
P-144187
pekfos
» 2016-01-30 17:34:56
pekfos, ale jeśli rozmiar tego pliku ma być zmienny to jaką ilość pamięci powinienem wg Ciebie zarezerwować?
Rozmiar da się oszacować z góry, a jeśli danych jest zbyt wiele, może nawet nie powinieneś ich wczytywać w całości?
P-144188
« 1 » 2 3 4 5
  Strona 1 z 5 Następna strona