如何传递std::数组

How do you pass a std::array?

本文关键字:数组 std 何传递      更新时间:2023-10-16

我正在尝试这样简单的东西:

template<class T>
array insertionSort(array<T> arr) {
    for (int index = 1; index < arr.size(); index++) {
        for (int insertion = index; insertion > 0 && array[insertion - 1] > array[insertion]; insertion--) {
            std::swap(array[insertion - 1], array[insertion]);
        }
    }
    return arr;
}
void main() {
    array<int, 10> mine = { 1, 0, 2, 9, 3, 8, 4, 7, 5, 6 };
    array result = insertionSort<int>(mine);
    cin.get();
}

数组似乎需要两个类型参数(typesize),那么如何在不预先知道大小的情况下将其传递给函数和从函数传递呢?

通常情况下,您并不想到处传递容器!适用于std::array<T, N>的相同算法也适用于其他数据结构,例如std::vector<T>std::deque<T>。在这种情况下,C++方法是传递迭代器并[稍微]调整算法:

template<typename BidrectionalIterator>
void insertionSort(BidirectionalIterator begin, BidirectionalIterator end) {
    for (BidirectionalIterator it(begin); it != end; ++it) {
        for (BidirectionalIterator insertion(it), tmp(insertion);
             begin != insertion && *--tmp > *insertion; --insertion) {
             std::swap(*tmp, *insertion);
        }
    }
}

(我没有验证算法是否真的有效,但你明白了)。

请注意,算法有意将序列排序到位!如果你想创建一个排序的副本,请创建副本并进行排序:这样,你就可以选择是否就地执行,而不是被迫使用可能需要过多内存的方法(好吧,当序列很大时,你肯定不想使用这种算法,但这是另一个问题)。

它的工作方式与在不知道类型的情况下传递对象的工作方式相同。您使用一个模板参数:

template<class T, size_t arrSize>
std::array<T, arrSize> insertionSort(std::array<T, arrSize> arr) {
    for (int index = 1; index < arrSize; index++) {
        for (int insertion = index; insertion > 0 && array[insertion - 1] > array[insertion]; insertion--) {
            std::swap(array[insertion - 1], array[insertion]);
        }
    }
    return arr;
}

IMO,您只需要将大小作为模板参数传递,并在循环中使用它,而不是arr.size():

template<class T, size_t size>
array<T, size> insertionSort(array<T> arr) {
    for (int index = 1; index < size; index++) {
        for (int insertion = index; insertion > 0 && array[insertion - 1] > array[insertion]; insertion--) {
            std::swap(array[insertion - 1], array[insertion]);
        }
    }
    return arr;
}
void main() {
    array<int, 10> mine; mine.fill(0);
    array<int, mine.size()> result = insertionSort<int, mine.size()>(mine);
    cin.get();
}