Templated bubblesort

Templated bubblesort

本文关键字:bubblesort Templated      更新时间:2023-10-16

我只想制作一个简单的气泡排序,它将与任何容器一起使用:list,vector ...

template<typename T>
void simpleSort(T& container){
    for(typename T::iterator iterA = container.begin(); iterA != container.end(); ++iterA){
        for(typename T::iterator iterB = iterB; iterB != container.end(); ++iterB){
            if(*iterA > *iterB){
                typename T::value_type temp{*iterA};
                *iterA = *iterB;
                *iterB = temp;
            }
        }
    }
}
int main(){
    vector<int> a = {10, 4, 66, 2, 444};
    simpleSort(a);
    for_each(a.begin(),a.end(), [](int i) {cout << i << endl;});
}

//在此处获取分割故障

行:

for(typename T::iterator iterB = iterB; iterB != container.end(); ++iterB){

您将非定位的iTerb分配给iterb而不是值itera。

这应该解决您的问题;并且应该更有效。

template<typename Type>
void simpleSort( Type& container ) {
    typename Type::iterator iterA = container.begin();
    typename Type::iterator iterB;
    for ( ; iterA != container.end(); ++iterA ) {
        for ( iterB = iterA; iterB != container.end(); ++iterB ) {
            if ( *iterA > *iterB ) {
                /*typename Type::value_type temp { *iterA };
                *iterA = *iterB;
                *iterB = temp;*/
                std::iter_swap( iterA, iterB );
            }
        }
    }
}

正如他的回答中提到的Soronelhaetir;您正在将iterB初始化为已经不可原始化的。通过访问无效的迭代索引,这可能会导致UB和分割故障。同样,以上内容使这里更加有效的是,我从第一个循环中删除了iterA的声明,并仅初始化了一次,而不是每次在for for for中进行检查。