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

Vector- pobieranie danych z pliku.

0 głosów
128 wizyt
pytanie zadane 25 lutego 2018 w C i C++ przez garris Użytkownik (660 p.)

Witam.

Jaki będzie najbardziej wydajny i najbardziej "poprawny" sposób pobierania danych z pliku i zapisywania do vectora?

Załóżmy, że mam plik a w nim X liczb oddzielonych spacjami. Słyszałem o możliwości zrobienia tego z iteratorem i std::copy, ale kompletnie nie wiem jak miałoby to wyglądać. 

Jak dotąd robiłem to na zasadzie plik>>vector z użyciem pętli, a domyślam się, że pętle nie są tutaj konieczne.

Pozdrawiam!

komentarz 25 lutego 2018 przez j23 VIP (106,380 p.)

std::copy nie będzie wydajniejsze od typowej pętli z operatorem >>.

komentarz 25 lutego 2018 przez Patrycjerz Mędrzec (187,050 p.)

Jak dotąd robiłem to na zasadzie plik>>vector z użyciem pętli

Przecież taka konstrukcja nie będzie działać. Chodziło ci o plik >> vector[i]

komentarz 25 lutego 2018 przez garris Użytkownik (660 p.)
Pewnie, że tak był to przykład może i masz rację, że nie trafny, ale dlatego napisałem, że na zasadzie.

1 odpowiedź

+1 głos
odpowiedź 25 lutego 2018 przez Arkadiusz Sikorski Pasjonat (19,320 p.)

Nie sprawdziłem, ale powinno zadziałać:

#include <iostream>
#include <iterator>
#include <fstream>
#include <vector>
int main()
{
  std::ifstream inputStream("liczby.txt");
  std::istream_iterator<int> start(inputStream), end;
  std::vector<int> numbers(start, end);
  // gotowe, mamy liczby w wektorze
}

Korzystamy tutaj z konstruktora wektora, który jako parametry przyjmuje odpowiednio iterator początku i końca.

komentarz 25 lutego 2018 przez 10kw10 Pasjonat (22,750 p.)
Jak to się ma do wydajności, ile razy maleje gdybym pobrał normalnie pętlą?
1
komentarz 25 lutego 2018 przez Patrycjerz Mędrzec (187,050 p.)
Najprawdopodobniej konstruktor vectora wewnątrz też posiada pętlę, która iteruje po całym zakresie danych podanym w parametrach. Sądzę, że różnica wydajnościowa jest żadna, a może nawet na korzyść zwykłej pętli w kodzie.
komentarz 25 lutego 2018 przez garris Użytkownik (660 p.)
Okej, rozumiem. Dziękuję za wszystkie odpowiedzi!
1
komentarz 25 lutego 2018 przez mokrowski VIP (111,180 p.)
Największą wydajność osiągnąć możesz mapując plik na pamięć. Wtedy mechanizmy systemu zapewniają czytanie z wyprzedzeniem i z bardzo dużą prędkością.

Jeśli chcesz wczytać dane (czyli np. char) z pliku, nieco lepszą wydajność oferuje std::istreambuf_iterator.

Podobne pytania

0 głosów
1 odpowiedź 55 wizyt
pytanie zadane 31 grudnia 2018 w C i C++ przez marcel12qq Nowicjusz (120 p.)
0 głosów
1 odpowiedź 163 wizyt
pytanie zadane 19 października 2016 w C i C++ przez MasterKiller Nowicjusz (120 p.)
0 głosów
1 odpowiedź 46 wizyt
pytanie zadane 13 stycznia w C i C++ przez czujek22 Mądrala (7,160 p.)
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.Najlepsza odpowiedź

66,494 zapytań

113,266 odpowiedzi

239,865 komentarzy

46,630 pasjonatów

Przeglądających: 152
Pasjonatów: 0 Gości: 152

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...