如何传递std::数组
How do you pass a std::array?
我正在尝试这样简单的东西:
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();
}
数组似乎需要两个类型参数(type
和size
),那么如何在不预先知道大小的情况下将其传递给函数和从函数传递呢?
通常情况下,您并不想到处传递容器!适用于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();
}
相关文章:
- std::向量与传递值的动态数组
- std::vector的包装器,使数组的结构看起来像结构的数组
- 初始化具有非默认构造函数的std::数组项的更好方法
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 将 int 数组转换为 std::vector<int*>
- 输入std::数组时出现问题
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 为什么std::vector比数组慢
- C++如何生成std::数组列表
- 捕获lambda中的std::数组
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- std::数组边界检查如何工作?
- 通过unique_ptr访问std::数组
- 我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset
- 对象的数组-STD ::数组 - 构造函数初始化问题
- 标准::数组<std::array<T、N2>、N> 数据成员上的括号运算符重载
- 从未来对象数组std::vector中检索值
- 如何将动态数组(std::vector)传递给odbc函数SQLBindParameter