模板冒泡

时间:2017-12-18 20:23:51

标签: c++ templates

我想制作一个简单的冒泡排序,可以使用任何容器: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;});
}

//在此处获取分段错误

2 个答案:

答案 0 :(得分:3)

在行中:

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

您将未初始化的iterB分配给iterB而不是iterA值。

答案 1 :(得分:1)

这应该可以解决你的问题;并且应该更有效率。

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和分段错误。此外,上面提到的更有效的是,我从第一个for循环中删除了iterA的声明,并且只将其初始化一次,而不是每次都在for循环中检查它。