2016-01-20 2 views
0

У меня есть набор внутри класса, и я бы хотел определить новый порядок для этого набора, но порядок зависит от атрибута класса. Как его реализовать? Я пытался что-то вроде этогоC++ Определить порядок для набора внутри класса

class myclass{ 
    int c; 
    set<int,cmp> myset; 
    struct cmp{ 
     bool operator()(const unsint a, const unsint b) 
     const { 
      return (depends on c) ; 
      } 
    }; 
} 

, но это не сработало. Любая помощь приветствуется, спасибо.

EDIT: Проблема в том, что я не знаю априорно. Это значение, которое я получаю от ввода, и тогда оно будет всегда одинаковым.

+1

У вас есть [mcve]? – NathanOliver

ответ

0

return (depends on c) ;

Я думаю, что это не хорошая идея, чтобы сделать comapare функция зависит от c, потому что ваш set объект не уже построен дерево и не перестроение поддерживается std::set.

Кроме того, обратите внимание на то, что std::set требует, чтобы компаратор соответствовал строгое правило ненадлежащего заказа.

Вы можете прочитать больше на 'Compare' documentation и wikipedia

Что касается вашей проблемы, вы можете создать еще один набор с другой функции сравнения, а затем скопировать содержимое здесь.

typedef std::set<int, cmp2> anotherSet; 
std::copy(std::begin(firstSet), std::end(firstSet), std::inserter(anotherSet)); 

Однако, похоже, что вы на самом деле не нужно std::set, если у вас есть, чтобы изменить порядок его в зависимости от какого-либо параметра. Рассмотрите возможность использования другой структуры данных, такой как вектор или список. Кроме того, если вам нужна сложность доступа ~ O (log N), вы можете упорядочить данные до heap внутри вашего вектора.

+0

Отличный ответ, спасибо! Что делать, если я не знал значения априори? Могу ли я создать struct cmp после того, как я получу значение (пока оно работает)? – wewe

Смежные вопросы