我想制作一个简单的冒泡排序,可以使用任何容器: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;});
}
//在此处获取分段错误
答案 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循环中检查它。