2017-06-05 4 views
-6

J'ai créé un tableau de pointeurs vers un élément appelé struct. Donc, après avoir fait une table ** je viens de définir chaque pointeur dans le tableau à null pointeur, puis plus tard, j'ajoute des éléments. Maintenant, quand je itère, je ne peux pas définir mon point final() comme pointeur nul, car alors il arrêtera d'itérer au premier pointeur nul dans le tableau et il ne trouvera pas les éléments potentiels après ce pointeur nul.Que utiliser comme fin() itérateur C++?

Voilà comment je créé et rempli mon tableau au début avec nullptr:

table** = new element*[max_sz+1]; 
for(size_t i = 0; i <= max_sz; i++) table[i] = nullptr; 

Mon commencer iterator est le premier élément * qui n'est pas nullptr dans le tableau.

Alors, que dois-je définir? Des idées ?

+0

Aucun itérateur ici ... 'table ** = nouvel élément * [max_sz + 1];' - syntaxe invalide. – LogicStuff

+0

Le premier élément 'nullptr' après les éléments non null semble être un bon candidat. –

+0

Je dois le faire avec double tableau de pointeurs :( Qu'est-ce que vous voulez dire une syntaxe invalide? Il fonctionne parfaitement bien et l'itérateur fonctionne bien jusqu'à ce qu'il atteigne nullptr premier dans le tableau.Il retourne la plage de distance erronée entre début et fin –

Répondre

2

table + max_sz +1 serait un itérateur de fin approprié (dans le sens où un itérateur est une généralisation du concept d'un pointeur) dans votre cas.

Par exemple;

int *begin = table; 
int *end = table + max_sz + 1; 

for (int *i = begin; i != end; ++i) 
{ 
     // whatever 
} 

Une règle de la langue est qu'un pointeur vers un passé, la fin d'un tableau est valable (aussi longtemps que ce pointeur est déréférencé pas). Cela est vrai cependant, le tableau est créé (par exemple, en tant que statique, de durée de stockage automatique ou créé dynamiquement). N'oubliez pas que si un tableau est passé à une fonction en tant qu'argument, il est converti en un pointeur - et les informations de longueur doivent être transmises séparément.

Il vaudrait mieux utiliser un conteneur standard (par exemple, std::vector<element> ou, si des éléments doivent être créés dynamiquement, std::vector<std::unique_ptr<element> >) plutôt que tout ce qui implique des pointeurs bruts. Les deux pour faciliter l'obtention d'un itérateur, si nécessaire, et pour d'autres raisons.

+0

Oh et moi avons toujours créé la table max_sz + 1, mais je n'y ai jamais mis d'élément. Hmm alors qu'est ce que table [max_sz + 1] qui revient pour moi? Est-ce un peu de mémoire aléatoire dans le programme qui est à coup sûr jamais atteint donc c'est bon comme fin d'itération ou? Est-ce un élément non-initié *?Je sais que les vecteurs seraient beaucoup plus faciles mais la tâche indique que je ne dois pas utiliser de vecteurs et que je dois utiliser des pointeurs avec des tableaux :(@Peter –

+0

L'action d'évaluer 'table [max_sz + 1]' donne un comportement indéfini. – Peter