Jak szybko wczytać długi ciąg znaków w C++?

0

Witam!
Czego użyć, aby długi ciąg znaków (bez spacji, nawet do 1 000 000 znaków) wczytać jak najszybciej?
Czy wczytywanie do tablicy znakowej a wczytywanie do stringa różni się szybkością?
Zależy mi też na tym, aby sprawdzić z osobna każdy znak, w pętli poniżej widać dlaczego.
Próbowałem wczytywać w taki sposób:

for (int i=0; i<n; i++)

    {

        t[i] = getchar();

        if (t[i]=='X') suma++;

    }

albo

for (int i=0; i<n; i++)

    {

        scanf("%c", &t[i]);

        if (t[i]=='X') suma++;

    }

Czy istnieje jakiś szybszy sposób? Ewentualnie może być bez sprawdzania każdego znaku od razu - mogę przelecieć tablicę jeszcze raz i to sprawdzić.

Pozdrawiam i proszę o pomoc!
Daniel

0

A wiesz ile będzie tych znaków?
Wczytywanie do strona wiąże się z wielokrotnym resizowaniem tego stringa i w efekcie dodatkowym narzutem czasowym. Jeśli znasz maksymalny rozmiar od razu, to po prostu zaalokuj dużą tablicę.

0

Tak, 1 scanf'em.

0

1 000 000 znaków? Spory string... Pewnie taka zmienna się zmieści w pamięci, ale i tak nie jest to elegancka konstrukcja. Co konkretnie robisz? Bo może jest lepszy sposób na to wszystko...

0

1 000 000 znaków? Spory string... Pewnie taka zmienna się zmieści w pamięci,

Niecały megabajt? No proszę cię ;-)

0

Dobra, jestem noobem jeśli chodzi o pamięciowe sprawy. Nie wiem jak z dynamiczną ale wątpię by to zmieściło się w pamięci statycznej. A zresztą w ogóle nie wiem - jakoś nigdy nie miałem okazji się zapoznać z ograniczeniami pamięci w dzisiejszych komputerach więc jak możesz to mnie oświeć zamiast wyszydzać.

0

Z nikogo nie wyszydzam.
Statycznie jako zmienną lokalną rzeczywiście może być trudno, rozmiar stosu zależy od systemu operacyjnego, ale pod Windows typowy limit to 1-2 MB.
Dynamicznie możemy przydzielać sobie całe gigabajty, zależnie od dostępnego RAM-u i swapa.
Wracając do pytania, ważne by zrobić to tak, by pamięć przydzielać raz o już docelowym rozmiarze: bo jeśli pozwolimy bibliotece/kompilatorowi na dynamiczną relokację danych w miarę rośnięcia tablicy, będzie bardzo wolno.

0

A, sorki, po prostu nie lubię się czuć jak noob, a czasami palnę coś głupiego i tak się właśnie czuję...

0

OK, więc postanowiłem zrobić to scanfem:

scanf("%s", t);

Liczbę znaków znam wcześniej, więc tworzę tablicę zwykłą po uzyskaniu liczby znaków z klawiatury (jest to tablica o nazwie t). Z tym, że dla 1 000 000 znaków zdążyłem napisać tego posta i posłuchać muzyki, a program dalej pracuje ;]

0

Skoro znasz ilość znaków to daj zyć komputerowi i wczytaj za pomocą fread() całość na raz? ;)

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