copy_if

26 lutego 2009

Nic nie jest doskonałe, tak samo STL ma swoje braki i przeoczenia.

W standardowej bibliotece języka C++ zabrakło bardzo użytecznego algorytmu – copy_if – kopiowania z predykatem.

Prawdopodobnie został on usunięty przez przypadek z dostarczanych przez bibliotekę algorytmów generycznych, ale z tego co się orientuję, można znaleźć o nim wzmianki w drafcie nowego standardu – C++0x, także błąd powinien zostać naprawiony.

Tymczasem możemy korzystać z bardzo prostej implementacji tego algorytmu:

template<typename InIter, typename OutIter, typename Pred>
OutIter copy_if(InIter first, InIter last, OutIter result, Pred pred) {
 
	while (first != last) {
		if (pred(*first))
			*result++ = *first;
		++first;
	}
 
	return result;
}

Inną, bardzo ciekawą koncepcję rozwiązania problemu copy_if oraz innych algorytmów warunkowych przedstawił Łukasz Czerwiński w notce Algorytmy warunkowe.

Innym popularnym dziwactwem STL-a jest niemożność otwarcia strumienia plikowego przez podanie nazwy pliku w postaci standardowego typu napisowego string, dostarczanego przez tą bibliotekę. Konstruktor klasy ofstream przyjmuje tylko C-style string, czyli wskaźnik na tablice znków – char*, niekonsekwencję tą powinien naprawić nadchodzący standard.

Podobne notatki:

Może zainteresują Cię również następujące, pododbne notatki:

Nikt jeszcze nie skomentował tego wpisu.
Możesz być pierwszy.

Dodaj swój komentarz

Możesz użyć tych tagów XHTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Jeśli chcesz wstawić kilku linijkowy fragment kodu, użyj tagów <pre lang="x"></pre> (gdzie x język kodu np. cpp, perl, html). W ten sposób kod zostanie odpowiednio sformatowany i pokolorowany przez system.

Uwaga!

Na tym blogu działa system cache oraz filtr antyspamowy. Twój komentarz może być widoczny na stronie z pewnym opóźnieniem. Proszę o cierpliwość. Jeśli utraciłeś już wszystkie jej zasoby poinformuj mnie o tym, być może system uznał Cię za spamera ;)