2016-04-16 2 views
0

Я пытаюсь иметь вторичный сортировку, основанную на количестве бит, установленных в структуре данных с именем «set_type», что является ничем иным, как typedef для uint64_t. Что может пойти не так? Поскольку, если я удаляю оператор return (n1> n2), тогда код выполняется отлично. Тем не менее, я хочу сохранить узлы в SET в порядке возрастания двойного значения и в порядке убывания количества бит, установленных в SET_TYPE.Ошибка сегментации: вторичная сортировка в SET C++ 11

struct setNode { 
    std::pair<double,set_type> data; 
}; 

unsigned int bitCount (set_type value) { 
    unsigned int count = 0; 
    while (value > 0) {   // until all bits are zero 
     if ((value & 1) == 1)  // check lower bit 
      count++; 
     value >>= 1;    // shift bits, removing lower bit 
    } 
    return count; 
} 

struct CompClass { 
    bool operator() (const setNode& lhs, const setNode& rhs) const 
    { 

     if (lhs.data.first == rhs.data.first) { 
      int n1 = bitCount(lhs.data.second); 
      int n2 = bitCount(rhs.data.second); 
      return n1 > n2;**//Statement causing error** 
     } 
     return lhs.data<rhs.data; 
    } 
}; 
+1

Просьба показать [mcve]. –

ответ

0

Ваш вопрос не заполнен. Вы оставили определение set_type вне вопроса. В будущем, создавайте минимальные автономные программы при формировании вопросов. Помимо всего прочего, создание минимальной программы часто приведет вас к пониманию проблемы.

Все остальное в этом ответе - это чистое догадки.

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

Во-вторых, я уверен, что проблема находится в определении set_type. Вероятно, вы проигнорировали rule of three. Многие забывают, что класс C++ имеет конструктор копии по умолчанию, если вы явно не отключите его.

Если ни один из них не отвечает на ваш вопрос, просто создайте минимальный пример компиляции и опубликуйте новый вопрос.

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