Najszybszy sposób wczytywania [c++]

0

Jakie są najszybsze sposoby wczytywania:

  • Liczb całkowitych
  • Liczb wymiernych
  • Ciągów liczb w jednej linii
  • Ciągów liczb, każda w osobnej linii
  • Ciągów znaków w linii
  • Ciągów znaków w osobnych liniach

Dzięki!

0
//1.
int iLiczba;
scanf("%d", &iLiczba);
//2.
float /*double*/ fLiczba;
scanf("%f", fLiczba);
//3.
std::string ciagLiczb;
getline(cin, ciagLiczb);
//4.
float* tab = new float[n];
for(int i = 0; i < n; ++i)
     cin >> tab[i];
delete [] tab;
//5.
std::string ciagZnakow;
getline(cin, ciagZnakow);
//6.
char** tab = new char*[m];
for(int i = 0; i < m; ++i)
     scanf("%s", tab[i]);

To chyba tak będzie.

0

Mieszasz cstdio z iostream. Jeżeli pomieszasz tak w kodzie, to stracisz mocno na wydajności. Używaj cstdio wszędzie, to bedziesz miał wysoką wydajność.

0

Przecież nawet w dokumentacji msdn mieszają jedno z drugim. cstdio jest częścią iostream.

0
MJay napisał(a)

Przecież nawet w dokumentacji msdn mieszają jedno z drugim. cstdio jest częścią iostream.

Że jak? Cstdio i iostream to dwie osobne biblioteki, ta pierwsza to pozostałość z C, ta druga jest oparta na strumieniach...
Poza tym przy wyłączeniu synchronizacji strumieni z stdio (ios_base::sync_with_stdio(0)) prędkość wczytywania/wypisywania jest zbliżona do tych używających cstdio.

0

Poza tym przy wyłączeniu synchronizacji strumieni z stdio (ios_base::sync_with_stdio(0)) prędkość wczytywania/wypisywania jest zbliżona do tych używających cstdio.

Doświadczenia wielu ludzi z zadaniami na SPOJu czy podobnych świadczą o sytuacji odwrotnej. Używanie iostream do czytania czy pisania do plików mija się z celem generalnie, no chyba że te pliki są bardzo małe. Oczywiście zawiera się w tym przypadek przekierowywania standardowego wejścia/ wyjścia. iostream jest OK do wczytywania inputu przez klawiaturę, bo tam wąskim gardłem jest człowiek.

0

ja tak robie:

// jesli uzywam gdzies iostream na poczatku kodu powinno być ios_base::sync_with_stdio(0); i wtedy NIE MIESZAĆ z scanf/printf
//1
scanf("%d",&d);
cin >> d;
//2
scanf("%f",&f);
cin >> f;

//3 i 4 - jeśli potem nic nie ma na wejściu i nie znasz ilości:
while (scanf("%d",&d)==1)
{
  // jakies operacje
}
while (cin >> d)
{
}
// jeśli dalej coś występuje:

string ciag;
getline(cin, ciag);
stringstream ss(ciag);
while (ss >> d)
{
  // jakies operacje
}

// Ciągów znaków w linii jeśli znasz długość linii
fread(stdin,..);
cin.read(...);
// jeśli znasz maksymalną długość linii
char s[MAX];
gets(s); // WARNING!!! używanie jest niebezpieczne w normalnych programach (buffer overflow)

// jeśli nic nie wiesz o długości:
string ciag;
getline(cin, ciag);

// Ciągów znaków w osobnych liniach - nie wiem jak coś może być w ciągu i w osobnych liniach jednocześnie
0

Może i iostream jest trochę wolniejsze, ale po wyłączeniu synchronizacji z stdio już niewiele wolniejsze. W rzeczywistych zastosowaniach raczej nie ma sensu poświęcaj wygody używania strumieni dla tak niewielkiego zysku wydajności. No chyba, że cały program opiera się mocno na bardzo, bardzo częstym zapisie i odczycie za pliku(takie przypadki są bardzo rzadkie).
stdio ma sens w sumie głównie przy takich zastosowaniach jak spoj, gdzie się walczy o każdą milisekundę.

0

Wypisywanie danych bywa szybsze przy użyciu cout niż printf.

0

Dzięki. Popróbuję, jak będzie szybciej w moim kompilatorze. Nie wiedziałem o tej synchronizacji. Jak jej wyłączenie wpływa na program?

0

Wyłączenie synchronizacji przyśpiesza strumienie, ale nie możesz ich wtedy mieszać z funkcjami z cstdio

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