使用qsort的子矢量

时间:2016-07-07 17:35:13

标签: c++ arrays void-pointers qsort strict-aliasing

我写了一个答案here来使用qsort来排序数组数组。由于在swap操作中使用了赋值运算符,我无法使用sort

我相信我的答案的规定是:

  

数组元素的类型必须是TrivialType,否则行为未定义

所以我的问题是: int[2]是“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;
    }});

3 个答案:

答案 0 :(得分:1)

是的,int[2]是一种微不足道的类型。来自basic.types / 9

  

...标量类型,普通类类型(Clause [class]),这样的数组   类型和这些类型的cv限定版本   ([basic.type.qualifier])统称为普通类型。 ...

int是标量类型。

答案 1 :(得分: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

答案 2 :(得分:1)

int是[basic.fundamental]的算术类型,算术类型也称为标量类型[basic.types] / 9

  

算术类型(3.9.1),枚举类型,指针类型,指向成员类型的指针(3.9.2),std :: nullptr_-t和这些类型的cv限定版本(3.9.3)统称为标量类型

然后我们

  

标量类型,普通类类型(第9条),此类型的数组和这些类型的cv限定版本(3.9.3)是统一的   称为普通类型

强调我的

因此标量类型和标量数组都是普通类型

草案N3797的所有引用