我正在尝试编写一个冒充模板函数的实现。
当我用常规的ol'数组测试这个算法时,它似乎工作得很好。我得到了正确的输出。
然而,当我用向量测试它时,我得到一个length_error异常,我不确定为什么。
template<class T>
void swap_right(T a[], int index)
{
T temp = a[index];
a[index] = a[index+1];
a[index+1] = temp;
}
template<class T>
void bubbleSort(T a[], int size)
{
for(int i = 0; i < size; ++i)
{
for(int j = 0; j < (size-i); ++j)
{
if(a[j] > a[j+1])
{
swap_right(a, j);
}
}
}
}
#include <iostream>
#include <vector>
int main(int argc, const char * argv[])
{
std::vector<int> v {9, 5, 3, 7, 4, 1};
bubbleSort(&v, 6);
for(int i = 0; i < 6; ++i)
{
std::cout << v[i] << std::endl;
}
return 0;
}
答案 0 :(得分:2)
您传递一个指向矢量的指针,这基本上意味着您尝试对矢量数组进行排序,这是不正确的,并将导致未定义的行为。
相反,您应该使用例如向量传递向量的内容。 data()
成员函数:
bubbleSort(v.data(), v.size());
答案 1 :(得分:0)
我建议让你的函数接受std :: vector&amp;而不是T []。
我还建议使用std :: swap而不是自定义版本。 - Alex Zywicki 3分钟前编辑
#include <iostream>
#include <vector>
template<class T>
void bubbleSort(std::vector<T>& a)
{
for(unsigned i = 0; i < a.size(); ++i)
{
for(unsigned j = 0; j < (a.size()-i)-1; ++j)
{
if(a[j] > a[j+1])
{
std::swap(a[j],a[j+1]);
}
}
}
}
int main(int argc, const char * argv[])
{
std::vector<int> v {9, 5, 3, 7, 4, 1};
bubbleSort(v);
for(unsigned i = 0; i < v.size(); ++i)
{
std::cout << v[i] << std::endl;
}
return 0;
}
现场演示:http://coliru.stacked-crooked.com/a/e22fe55a38425870
结果是:
1 3 4 5 7 9