c++11 | STL | cbegin() vs begin() Jakie są różnice ?

0

Jak w temacie. Czym rożni sie metoda cbegin() od begin()? Mam na myśli praktyczne zastosowanie cbegin(), wiem tylko tyle ze cbegin() jest lepsza bo zwraca iterator. Poprawka: Obie metody zwracają iterator lub const_iterator dla cbegin().

std::vector::cbegin();
std::vector::begin();

Dziękuję za odpowiedz.

2

cbegin i cend po prostu zwracają const iterator, gdzie zwykły begin i end zwracają mutable iterator

2

Jest w tym lepsza, że zwraca const_iterator, więc dajesz czytelnikowi kodu (oraz kompilatorowi) do zrozumienia, że nie jest Twoją intencją modyfikacja elementów kontenera. Dzięki temu kompilator może rzucić errorem gdy coś takiego zrobić zamiast po cichu na to zezwolić.

0

W takim razie jaka jest różnica (praktyczna) w tych dwóch zapisach:

std::vector<int> vector1;
//vector1.push_back(1); itp...


std::vector<int>::const_iterator iter_const;

iter_const=vector1.begin(); 	//Tutaj sposob.1 
iter_const=vector1.cbegin();	//Tutaj sposob.2

w obu przypadkach nie mogę modyfikować vectora np. *iter_const=12 wiec nie mogę zrozumieć różnicy w działaniu.

Dziękuję za odpowiedz.

PS Zachodzi jakaś niejawna konwersja dla sposob.1?

0

Dziwne pytanie, najpierw pytasz o różnicę między cbegin a begin, a nagle pytanie ewoluowało w cbegin a push_back - pytasz o różnicę między jajecznicą a benzyną.

3

Żadna, ale pisanie całego typu nie jest wygodne, poza tym już w następującym kodzie złośliwy funktor zamiast zliczyć elementy równe 2, zmienia zawartość wektora. Przy użyciu cbegin() i cend() kompilator powie "hola hola, chyba nie o to chodziło!".

auto main() -> int
{
	vector<int> foo{1,2,3,4,5};

	auto result = count_if(foo.begin(), foo.end(), [](auto&& c){ return c = 2;});
	DBG(result); // 5
	DBG_CONT(foo); // 2 2 2 2 2
}

http://melpon.org/wandbox/permlink/YJLIu2LavyN1u2hP

3

Nie możesz modyfikować bo zdefiniowałeś sobie const_iterator. Jak używasz .begin() to zazwyczaj używasz iterator.

vector<int>::iterator it = vector1.begin();
vector<int>::const_iterator cit = vector1.cbegin();

Zauważ, że przed C++11 właśnie tak pisano

vector<int>::const_iterator it = vector1.begin();

Ale jeśli używasz auto to chcesz mieć możliwość zwracania const_iterator

auto it = vector1.begin();     // iterator
auto it2 = vector2.cbegin();     // const_iterator
0

Dziękuje za pomoc. :)

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