Vous pourriez essayer quelque chose comme :
list<string> iterator it = whichList.begin();
std::advance(it, i);
if(*it == "") { /* ... */ }
Mais je pense que vous devez définir clairement ce que vous entendez par "vide" ici - vous ne pouvez pas comparer des chaînes à 0.
Le point essentiel est que list
ne supporte pas l'accès aléatoire - à cause de son implémentation (une liste doublement liée), supporter l'accès aléatoire serait une erreur de programmation. O(n)
c'est-à-dire linéaire dans la longueur de la liste dans le pire des cas. C'est inefficace, et c'est pourquoi l'interface ne le supporte pas.
Comme d'autres l'ont souligné, si vous voulez un accès aléatoire, il est préférable d'utiliser quelque chose comme un fichier de type vector
o deque
. En règle générale, vous utiliserez un vector
si vous n'avez besoin d'une insertion/désinsertion rapide qu'à la fin du conteneur, une deque
si vous avez également besoin d'une insertion/extraction rapide à l'avant du conteneur, et d'une list
seulement si vous avez besoin d'une insertion/extraction rapide au milieu du conteneur. Afin de supporter ce dernier type d'opération, list
finit par sacrifier l'accès aléatoire aux éléments.
Voir ici pour la définition de advance
d'ailleurs :
http://www.sgi.com/tech/stl/advance.html
EDIT : Comme Alf l'a souligné, il est possible, dans une certaine mesure, d'obtenir une insertion/suppression rapide au milieu d'un vecteur en utilisant la technique du gap buffer (voir http://en.wikipedia.org/wiki/Gap_buffer ), bien qu'une opération individuelle puisse être coûteuse si vous comblez le vide (l'idée est d'amortir le coût sur de nombreuses opérations, ce qui rend une séquence d'opérations comparativement bon marché).