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

Vector- pobieranie danych z pliku.

Object Storage Arubacloud
0 głosów
308 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 (194,920 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 (155,460 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ź 708 wizyt
pytanie zadane 13 czerwca 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
0 odpowiedzi 62 wizyt
0 głosów
1 odpowiedź 521 wizyt
pytanie zadane 13 stycznia 2019 w C i C++ przez czujek22 Dyskutant (7,670 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...