получение членов C ++ std :: set по индексу - PullRequest
1 голос
/ 13 июля 2011

Есть ли способ использовать один из описанных алгоритмов stl, чтобы получить член набора, используя его индексную позицию в наборе?

Я мог бы использовать вспомогательный метод, подобный приведенному ниже, но яЯ должен думать, что это уже существует в некоторой общей форме в stl:

ElementPtr elementAt(int elementNumber)
{
    list<ElementPtr>::iterator elementIt = elements.begin();
    for (int counter = 0; counter < elementNumber && elementIt != elements.end(); counter++, elementIt++) 
    {
    }

    return *elementIt;
}

Ответы [ 8 ]

3 голосов
/ 13 июля 2011
#include <iterator>

list<ElementPtr>::iterator elementIt = elements.begin();
std::advance(elementIt, elementNumber);
x = *elementIt;

Что по сути делает то, что делает ваш код.

Но тот факт, что вы хотите сделать это, скорее всего, указывает на то, что ваши структуры данных неверны.Наборы не предназначены для такой обработки.

2 голосов
/ 13 июля 2011

Вы можете сделать это, используя Boost.MultiIndex , чтобы построить индексы упорядочения и произвольного доступа на одних и тех же базовых данных.

2 голосов
/ 13 июля 2011

Вы действительно используете правильный тип контейнера?Попробуйте вместо этого использовать отсортированный вектор.

2 голосов
/ 13 июля 2011

Не существует пригодного для использования механизма индекса, если он реализован в виде двоичного дерева или хеш-таблицы, оба из которых являются общими для наборов.

1 голос
/ 13 июля 2011

Лучшее, что вы получите, - это итератор. Наборы - это контейнеры, в которых значение равно индекса (ну, это больше ссылки в хеш-таблице). Может быть, мы могли бы лучше ответить на ваш вопрос, если бы знали, что вы пытаетесь сделать.

Я думаю, что вы приравниваете набор к массиву; они структурированы по-разному, числовой индекс не применяется.

1 голос
/ 13 июля 2011

Я не верю, так как "index-of" не имеет смысла с точки зрения обобщенного std::set.Если ваш набор не создается (и не инициализируется) один раз и никогда не изменяется, то вы не можете гарантировать, что результаты вызовов оператора index-of всегда будут возвращать предсказуемый результат.

0 голосов
/ 13 июля 2011

Не существует такого понятия, как числовой индекс в наборе.Вам нужно использовать вектор вместо.И более того, если вам случится «получить n-й предмет» в наборе, то не гарантируется, что он будет там (в том же месте) после изменения набора.

0 голосов
/ 13 июля 2011

Вы говорите set, но ваш код фактически указывает на список. Два не одинаковы. Наборы предназначены для получения их элементов по их значению. Списки, вы можете просто продвигаться по ним, используя std::advance.

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