Sdílet prostřednictvím


Algoritmy (moderní verze jazyka C++)

Pro moderní programování C++ doporučujeme použít algoritmy v knihovně standardních šablon (STL).Zde jsou některé důležité příklady:

  • for_each, což je výchozí algoritmus pro procházení. (Sémantika mimo místo viz transform.)

  • find_if, což je výchozí algoritmus pro hledání.

  • sort, lower_bound a ostatní výchozí algoritmy řazení a vyhledávání.

Chcete-li zapsat komparátor, použijte přísné < a pojmenované lambda výrazy, kde je to možné.

auto comp = []( const widget& w1, const widget& w2 )
      { return w1.weight() < w2.weight(); }

sort( v.begin(), v.end(), comp );

auto i = lower_bound( v.begin(), v.end(), comp );

Smyčky

Pokud je to možné, použijte smyčky for na základě rozsahu volání algoritmu nebo obojí místo ručně psané smyčky.copy, transform, count_if, remove_if a ostatní jim podobné, jsou mnohem lepší, než psané smyčky, protože jejich záměr je zřejmý a usnadňují zápis kódu bez chyb.Také mnoho algoritmů STL mají optimalizace implementace, které je zefektivňují.

Namísto starého C++, jako je tento:

for( auto i = strings.begin(); i != strings.end(); ++i ) {
  :::
  :::
}

auto i = v.begin();

for( ; i != v.end(); ++i ) {
  if (*i > x && *i < y) break;
}

Použijte moderní C++ následujícím způsobem:

for_each( begin(strings), end(strings), []( string& s ) {
  :::
  :::
} );
auto i = find_if( begin(v), end(v),  [=](int i) { return i > x && i < y; }  );

Smyčky For vycházející z rozsahu

Smyčka for podle rozsahu je funkcí jazyka C++11, nikoli algoritmem STL.Ale to si zaslouží zmínku v této diskuzi o smyčkách.Na základě rozsahu smyček for jsou rozšíření klíčového slova for a poskytují pohodlný a účinný způsob, jak psát smyčky, které iterují v rozsahu hodnot.Kontejnery, řetězce a pole STL jsou předdefinované pro smyčky for na základě rozsahu.Chcete-li tuto novou syntaxi iterace povolit pro váš typ definovaný uživatelem, přidejte následující podporu:

  • Metoda begin, která vrátí iteraci na začátek struktury, a metoda end, která vrátí iteraci na konec struktury.

  • Podpora v iterátoru pro tyto metody: operator*, operator!= a operator++ (verze předpony).

Tyto metody mohou být členy nebo samostatné funkce.

Náhodná čísla

Je známo, že stará funkce CRT rand() má mnoho vad, které byly komunitou C+++ dlouze prodiskutovány.V moderním jazyce C++ nemusíte řešit tyto nedostatky – nemusíte ani vytvářet vlastní uniformně distribuovaný generátor náhodných čísel vzhledem k tomu, že nástroje pro jejich rychlé a snadné vytváření jsou k dispozici v STL, jak je uvedeno v <random>.

Viz také

Další zdroje

C++ vás vítá zpět (moderní verze jazyka C++)

Referenční dokumentace jazyka C++

Standardní knihovna C++ – referenční dokumentace