существует ли структура данных stl, которая "содержит" текущий индекс / указатель элемента? - PullRequest
1 голос
/ 18 октября 2010

Я хотел бы улучшить свой стиль кода на C ++, поэтому я решил, что мне обязательно нужно углубиться в stl ... сначала, так как мне это нужно в реальном случае, я хотел бы знать, доступен ли он какой-то контейнер, который содержит текущий индекс внутри ...

например, я имею в виду некоторый контейнерный класс, по которому я могу перемещаться с помощью next () / prev (), но я также могу спросить для get (), чтобы получить текущий, без необходимости сохранять текущий индекс / указатель в моем собственном члене класса

(уже взглянул на stl vector / deque, надеюсь, я не внимательно прочитал doc)

Ответы [ 4 ]

1 голос
/ 18 октября 2010

Короткий ответ - нет.Одним из основных принципов разработки стандартных контейнеров является отделение итерации от содержимого - т. Е. Вам всегда нужен отдельный итератор для отслеживания текущего «пятна» в любом заданном контейнере.

Контейнеры, которые объединяют ограничение с итерациейбыло довольно распространено в старых проектах, но это делает почти невозможным, чтобы разные части кода проходили итерацию через определенный контейнер одновременно.

1 голос
/ 18 октября 2010

Да, если я правильно понимаю ваш вопрос, вы хотите посмотреть на итераторы.Вот пример:

std::vector<int> someVector;
// add elements to the vector here
// ...
std::vector<int>::iterator start = someVector.begin();
std::vector<int>::iterator end = someVector.end();
while(start != end)
{
    std::cout << *start << std::endl;
    ++start;
}

Они ведут себя аналогично указателям, и все контейнеры stl имеют итераторы.Помните, что существуют разные типы итераторов (обратный, постоянный, двунаправленный, прямой, произвольный доступ и т. Д.) И что для них доступны различные операции.

1 голос
/ 18 октября 2010

Если я правильно понимаю ваши потребности, то нет, нет контейнера stl, в котором хранится итератор какого-либо текущего элемента. Но я не понимаю, почему вы не хотите хранить этот итератор самостоятельно? Как это:

ContainerType cont;
ContainerType::iterator current;

теперь вы можете сделать ++current; --current (если в контейнере есть итераторы bidir); и *current

1 голос
/ 18 октября 2010

Звучит так, как будто вам нужен итератор .

Итератор используется с контейнером.Он действует как указатель на позицию в контейнере, и вы можете увеличивать (следующий) и уменьшать (предыдущий).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...