205 votes

Quelle est la raison de cbegin/cend ?

Je me demande pourquoi cbegin y cend ont été introduites dans C++11 ?

Quels sont les cas où l'appel de ces méthodes fait une différence par rapport aux surcharges constantes de begin y end ?

2voto

hkBattousai Points 1930

iterator y const_iterator ont une relation d'héritage et une conversion implicite se produit lorsqu'ils sont comparés ou affectés à l'autre type.

class T {} MyT1, MyT2, MyT3;
std::vector<T> MyVector = {MyT1, MyT2, MyT3};
for (std::vector<T>::const_iterator it=MyVector.begin(); it!=MyVector.end(); ++it)
{
    // ...
}

Utilisation de cbegin() y cend() augmentera les performances dans ce cas.

for (std::vector<T>::const_iterator it=MyVector.cbegin(); it!=MyVector.cend(); ++it)
{
    // ...
}

0voto

C'est simple, cbegin renvoie un itérateur constant alors que begin ne renvoie qu'un itérateur.

Pour mieux comprendre, prenons deux scénarios

scénario - 1 :

#include <iostream>
using namespace std;
#include <vector>
int main(int argc, char const *argv[])
{
std::vector<int> v;

for (int i = 1; i < 6; ++i)
{
    /* code */
    v.push_back(i);
}

for(auto i = v.begin();i< v.end();i++){
    *i = *i + 5;
}

for (auto i = v.begin();i < v.end();i++){
    cout<<*i<<" ";
}

return 0;
}

cela fonctionnera parce qu'ici l'itérateur i n'est pas constant et peut être incrémenté par 5

utilisons maintenant cbegin et cend en les désignant comme des itérateurs constants scénario - 2 :

#include <iostream>
using namespace std;
#include <vector>
int main(int argc, char const *argv[])
{
std::vector<int> v;

for (int i = 1; i < 6; ++i)
{
    /* code */
    v.push_back(i);
}

for(auto i = v.cbegin();i< v.cend();i++){
    *i = *i + 5;
}

for (auto i = v.begin();i < v.end();i++){
    cout<<*i<<" ";
}

return 0;
}

cela ne va pas fonctionner, car vous ne pouvez pas mettre à jour la valeur en utilisant cbegin et cend qui renvoient l'itérateur constant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X