2016-07-07 5 views
1

Я написал ответ here, чтобы использовать qsort для сортировки массива массивов. Я не мог использовать sort из-за использования оператора присваивания в операциях swap.Использование суб-векторов с qsort

Я считаю, что условие на мой ответ работы является:

тип элементов массива должен быть TrivialType, в противном случае поведение не определено

Так что мой вопрос: int[2] a "TrivialType"?


Фактический код в ответ, что запрос на этот вопрос:

int array[5][2] = { {20, 11}, {10, 20}, {39, 14}, {29, 15}, {22, 23} }; 
static const auto SIZE = size(*array); 

qsort(array, size(array), sizeof(*array), [](const auto lhs, const auto rhs) { 
    const auto first = reinterpret_cast<const int*>(lhs); 
    const auto last = next(first, SIZE); 
    const auto its = mismatch(first, last, reinterpret_cast<const int*>(rhs)); 

    if (its.first == last) { 
     return 0; 
    } else if (*its.first < *its.second) { 
     return -1; 
    } else { 
     return 1; 
    }}); 
+0

Вам необходимо перейти по ссылкам: http://en.cppreference.com/w/cpp/types/is_trivial: *, то есть скаляр типа, тривиальный копируемый класс с тривиальным конструктором по умолчанию или массив такого типа/класса, возможно, cv-qualified * – NathanOliver

+0

IIRC вам следует предпочесть 'std :: sort()' over 'qusort()'. –

+0

@ πάνταῥεῖ Вы правильно прочитали вопрос? Я прямо объяснил, почему это не сработает. –

ответ

1

int является арифметика типа в [basic.fundamental] и арифметический тип также называют скалярным типом в [basic.types]/9

Арифметические типы (3.9.1), типы перечислений, типы указателей, указатели на типы членов (3.9.2), std :: nullptr_-t и cv-квалификационные версии этих типов (3.9.3) под общим названием скалярных типов.

и тогда мы имеем

Скалярные типы, типы тривиальным класса (пункт 9), массивы таких типов и резюме квалифицированных версий этих типов (3.9.3) коллективно называемых тривиальных типов

курсив моего

так что скалярная тип и массив скаляра оба тривиальных типов.

Все цитаты из проекта N3797

1

Да, int[2] тривиальный вид. Из basic.types/9

... Скалярные типов, тривиальные типов классов (пункт [класс]), массивов таких типов и резюме квалифицированных версий этих типов ([basic.type. квалификатор]) называются тривиальными типами. ...

И int является скалярным типом.

1

Так что мой вопрос: ли int[2] "TrivialType"?

Да, это так.

Вы можете легко проверить это, все необходимые инструменты под рукой из <type_traits>:

#include <type_traits> 
#include <iostream> 

int main() { 
    int a[2]; 

    std::cout << "a is " << (std::is_trivial<decltype(a)>()?"":"non ") << "trivial" << std::endl; 
} 

выходы

a is trivial 

См Live Demo

+0

Ха, я чувствую себя немного глупо сейчас ... Я предполагаю, что вы не хотели включать 'iomanip'? –

+1

@JonathanMee _ «Я предполагаю, что вы не хотели включать iomanip?» Да, я преждевременно включил его из видения, чтобы вывести что-то вроде «истина» или «ложь» и нужно использовать 'std :: boolalpha' , Я видел много, гораздо глупых вопросов здесь, кстати, не беспокойтесь. –