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

Vector- pobieranie danych z pliku.

Cloud VPS
0 głosów
441 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 Mędrzec (195,240 p.)

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

komentarz 25 lutego 2018 przez Patrycjerz Mędrzec (192,320 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 (20,160 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,880 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 (192,320 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 Mędrzec (158,900 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ź 999 wizyt
pytanie zadane 13 czerwca 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
0 odpowiedzi 86 wizyt
0 głosów
1 odpowiedź 577 wizyt
pytanie zadane 13 stycznia 2019 w C i C++ przez czujek22 Dyskutant (7,670 p.)

93,487 zapytań

142,420 odpowiedzi

322,772 komentarzy

62,904 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

Kursy INF.02 i INF.03
...