Вы можете попробовать что-то вроде:
list<string> iterator it = whichList.begin();
std::advance(it, i);
if(*it == "") { /* ... */ }
Но я думаю, что вам нужно четко определить, что вы подразумеваете под "пустым" - вы не можете сравнить строки с 0.
Ключевым моментом является то, что list
не поддерживает произвольный доступ - из-за его реализации (двусвязный список) поддержка произвольного доступа будет O(n)
операцией, то есть линейной по длине списка в худший случай. Это неэффективно, поэтому сознательно не поддерживается в интерфейсе.
Как уже отмечали другие, если вам нужен произвольный доступ, вам лучше использовать что-то вроде vector
или deque
. Вообще говоря, вы должны использовать vector
, если вам нужна только быстрая вставка / удаление в конце контейнера, deque
, если вам также требуется быстрая вставка / удаление в передней части контейнера, и только list
если вам нужно быстрое введение / удаление в середине контейнера. Чтобы поддержать последний тип операции, list
заканчивает тем, что жертвует произвольным доступом к элементам.
См. Здесь определение advance
, между прочим:
http://www.sgi.com/tech/stl/advance.html
РЕДАКТИРОВАТЬ: Как указал Альф, вы можете в некоторой степени получить быстрое вставление / удаление в середине вектора, используя технику буфера зазора (см. http://en.wikipedia.org/wiki/Gap_buffer),, хотя отдельная операция может быть дорогостоящей, если вы заполните разрыв (идея состоит в том, чтобы амортизировать стоимость по многим операциям, делая последовательность операций сравнительно дешевой).