Algorytmy (Modern C++)

Dla programowania w języku Modern C++ zaleca się używanie algorytmów w podanych w standardowej bibliotece szablonów (STL).Oto kilka przykładów ważnych:

  • for_each, który jest domyślnym algorytmem przechodzenia. (Również transform dla semantyki not-in-place).

  • find_if, który jest domyślnym algorytmem wyszukiwania.

  • sort, lower_bound i inne domyślne algorytmy wyszukiwania i sortowania.

Aby zapisać komparator, należy użyć ściśle < i o nazwie lambdas kiedy to możliwe.

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 );

Pętle

Jeśli to możliwe, używaj pętli opartych na zakresie for lub wywołań algorytmu, lub obu, zamiast pętli napisanych ręcznie.copy, transform, count_if, remove_if i inne podobne do tych są znacznie lepsze niż pętle odręczne, ponieważ ich zamiar jest oczywisty i ułatwiają one bezbłędne pisanie kodu.Ponadto wiele algorytmów STL ma zoptymalizowane wdrażanie, które czyni je bardziej efektywnymi.

Zamiast w starym języku C++ jak tak:

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

auto i = v.begin();

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

Użyj nowoczesnego C++, podobnego do tego:

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

Pętle oparte na zakresie

Bazująca na zakresie pętla for jest funkcją języka C++11, nie algorytmem STL.Ale to zasługuje na wzmiankę w tej dyskusji na temat pętli.Oparte na zakresie pętle for stanowią rozszerzenie słowa kluczowego for i zapewniają wygodny i wydajny sposób pisania pętli, które przechodzą przez zakres wartości.Kontenery STL, ciągi i tablice są gotowe do użycia przez bazujące na zakresie pętle for.Aby włączyć nową składnię iteracji dla Twojego typu zdefiniowanego przez użytkownika, należy dodać następującą obsługę:

  • Metoda begin, która zwraca iterację do początku struktury, i metoda end, która zwraca iterację na koniec struktury.

  • Wsparcie dla iteratorów dla tych metod: operator*, operator!=, i operator++ (wersja prefiks).

Te metody mogą być członkami lub funkcjami autonomicznymi.

Liczby losowe

Nie jest tajemnicą, że stara funkcja rand() środowiska CRT ma wiele wad, które zostały omówione szeroko w społeczności programistów C++.W języku Modern C++ nie masz do czynienia z tymi niedociągnięciami — ani nie musisz wymyślić własnego generator liczb losowych z równomiernym rozłożeniem, ponieważ narzędzia służące do szybkiego i łatwego tworzenia ich są dostępne w bibliotece STL, jak pokazano w temacie <random>.

Zobacz też

Inne zasoby

Zapraszamy ponownie do języka C++ (Modern C++)

Materiały referencyjne dotyczące języka C++

Odwołanie do standardowej biblioteki C++