Произвольный доступ и обновление stl :: set - PullRequest
0 голосов
/ 30 декабря 2010

Я использую stl :: set, чтобы элементы сортировались при вставке. Мой вопрос о произвольном доступе. Если у меня есть сложный класс (например, трудно инициализировать), я обнаружил, что его легко вставить, потому что я определяю оператор less в классе. Но если ключом является сам класс, как мне нужен доступ к классу? С находкой ()? Мне нужно инициировать сложный класс только для того, чтобы найти мой класс?

Итак, мой вопрос: как получить произвольный доступ к элементам набора, когда элементы сложных классов трудно инициализировать?

Спасибо

Ответы [ 5 ]

3 голосов
/ 30 декабря 2010

Вы можете:

1) создайте специальный инициализатор "lightweigt" для вашего класса, чтобы создать "легковесную" версию вашего объекта, и используйте такие "легкие" объекты только как ключи для доступа к карте

2) использовать карту вместо набора.

Я бы предпочел второе решение.

2 голосов
/ 30 декабря 2010

Я не думаю, что это возможно: как вы уже заметили, функция-член std::set<>::find ожидает const key_type & (что в std::set идентично value_type).

Если вы возражаете против создания объекта, есть вероятность, что вам лучше использовать std::map (который также является отсортированным контейнером), возможно, со значениями (умными) указателями для вашего типа.

2 голосов
/ 30 декабря 2010

Set не поддерживает итератор произвольного доступа. Если вы хотите сравнить объекты другим способом (не будете использовать оператор <), вы должны выполнить следующее </p>

1) первый путь

bool compareFunciton(const setElementClass& lhs,const setElementClass& rhs)
{
    //return true if lhs's key is smaller than rhs and false at other case
}


set<setElementClass,compareFunction>  someSet;

2) Или вы можете использовать класс функции вместо функции, подобной этой

class compareClass
{
public:
    bool opreator()const setElementClass& lhs,const setElementClass& rhs)
   {
          //return true if lhs's key is smaller than rhs and false at other case
    }
};

compaerClass comp;
set<setElementClass,comp>  someSet;

Также я думаю, что вы должны посмотреть на функциональный заголовок. Там вы можете найти некоторые классы функций, которые вы можете использовать в будущем. http://www.cplusplus.com/reference/std/functional/

1 голос
/ 30 декабря 2010

Вам нужно только определить менее структуру, как это:

#include <set>

using std::binary_function;
using std::set;


struct very_complex
{
    int x, y;
};

struct less : public binary_function<very_complex, very_complex, bool>
{
    bool operator() (very_complex const& lho, very_complex const& rho)
    {
        if (lho.x != rho.x)
            return lho.x < rho.x;
        return lho.y < rho.y;
    }
}
1 голос
/ 30 декабря 2010

Вы должны использовать набор?

Возможно, вам лучше использовать карту и генерировать ключ (возможно, числовой индекс или строку) для вашего сложного класса, а затем использовать объекты сложного класса в качестве значения.

Просто убедитесь, что ваш ключ соответствует тем же правилам упорядочения, что и значение.std :: map реализован в виде дерева, поэтому он также будет сортировать элементы по ключам.

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