2017-04-03 51 views
1

我正在寫一個類來測試不同排序算法(針對大學課程)的效率,以及我應該測試的算法的效率是STL排序。爲了衡量效率,我們定義了一個保持整型值的類Integer,並且允許我們在每次比較或分配時增加一個全局變量。然後我有一個驅動程序類,它測試多個整數向量上的std :: sort調用。我在Integer類中重載了'<'運算符,它符合嚴格的弱排序(至少我非常肯定它的確如此)。但是,每次我打電話排序時,都會出現分段錯誤。我真的不知道爲什麼發生這種情況,任何幫助將不勝感激。謝謝!std :: sort不適用於用戶定義的對象與oveloaded <運算符

Integer.cpp

#include "Integer.h" 

int Integer_count; 

//Default Constructor 
Integer::Integer() { 
    val = 0; 
} 

//Specified Constructor 
Integer::Integer(int x) { 
    val = x; 
} 

//Copy-Constructor 
Integer::Integer(const Integer &cp) { 
    Integer_count++; 
    val = cp.val; 
} 

//Return the Integer's value 
int Integer::value() { 
    return val; 
} 

//Less-than (<) operator overload 
bool Integer::operator < (const Integer& obj) const { 
    Integer_count++; 
    return (val < obj.val); 
} 

//Assignment (=) operator overload 
void Integer::operator = (const Integer& obj) { 
    Integer_count++; 
    val=obj.val; 
} 

driver.cpp

#include <iostream> 
#include <cstdlib> 
#include <vector> 
#include "Integer.h" 
#include "Sorter.cpp"  
srand (time(NULL)); //Seed the random number generator 

    std::vector<Integer> one; 
    std::vector<Integer> two; 
    std::vector<Integer> three; 
    std::vector<Integer> four; 
    std::vector<Integer> five; 


    for(int i=0; i<10000; i++){ 
     one[i] = Integer(i); 
     two[i] = Integer(10000-i); 
     three[i] = Integer(rand() % (10000+1)); 
     four[i] = Integer(rand() % (10000+1)); 
     five[i] = Integer(rand() % (10000+1)); 
    } 


    //Sort function called from the STL 
    //Sorted Array 
    std::sort(one.begin(), one.end()); 
    std::cout << "STL for Sorted Array: " << Integer_count << std::endl; 

基本上,我認爲的std ::排序功能不使用重載操作從我的Integer類,其正在搞亂堆棧。我不確定這是錯誤,但似乎無法解決它。

+1

你沒有爲你的std :: vectors分配任何空間。 '一個[我]'不會創建一個新元素。使用'one.push_back(Integer(i));' –

+0

vector []不插入新元素 - 使用push_back代替 – 4386427

+0

要預留向量空間,請寫'std :: vector one(10000)'例如。可選:'one.reserve(10000)'和循環'one.push_back(Integer(i))'而不是賦值。 – zett42

回答

0

std::vector::operator[]從未插入一個新元素插入到容器並且不執行邊界檢查(vector/operator_at)。如果您訪問超出界限的元素會導致您的情況出現未定義的行爲。

必須使用std::vector::emplace_backstd::vector::push_back,另一種選擇是使用與Tcount默認插入情況下構建容器構造explicit vector<T>(size_type count);

第一種選擇:

std::vector<Integer> one; 
one.reserve(10000); 
std::vector<Integer> two; 
two.reserve(10000); 
std::vector<Integer> three; 
three.reserve(10000); 
std::vector<Integer> four; 
four.reserve(10000); 
std::vector<Integer> five; 
five.reserve(10000); 

for (int i = 0; i < 10000; ++i) { 
    one.emplace_back(i); 
    two.emplace_back(10000 - i); 
    three.emplace_back(rand() % (10000+1)); 
    four.emplace_back(rand() % (10000+1)); 
    five.emplace_back(rand() % (10000+1)); 
} 

第二個選項:

std::vector<Integer> one(10000); 
std::vector<Integer> two(10000); 
std::vector<Integer> three(10000); 
std::vector<Integer> four(10000); 
std::vector<Integer> five(10000); 

for (int i = 0; i < 10000; ++i) { 
    one[i] = Integer(i); 
    two[i] = Integer(10000-i); 
    three[i] = Integer(rand() % (10000+1)); 
    four[i] = Integer(rand() % (10000+1)); 
    five[i] = Integer(rand() % (10000+1)); 
} 

and std::sort(one.begin(), one.end()) m最好的工作。

+0

非常感謝 - 試圖快速破解它,忘記了最簡單的語法。我的錯 :) –

1

您的向量[i]的值未分配。因此,訪問超出範圍的向量值(例如one[999999])導致未定義的行爲。

使用push_back()爲您std:::vector分配和分配值給你的載體:

for(int i=0; i<10000; i++){ 
    one.push_back(Integer(i)); 
    two.push_back(Integer(10000-i)); 
    three.push_back(Integer(rand() % (10000+1))); 
    four.push_back(Integer(rand() % (10000+1))); 
    five.push_back(Integer(rand() % (10000+1))); 
} 

這將解決segmentatio故障。 至於排序,一旦你有價值。

std::sort(one.begin(), one.end())sorts by default using operator<讓它保持原樣。

+0

錯字,快速回答。謝謝@ 4386427 – 0xDEFACED

0

您沒有在vector中添加/附加元素。不分配空間或推回來,你不能以這種方式添加向量中的元素(我的clang編譯器會由於分配不當/數組超出限制而產生運行時錯誤)。改爲使用push_back

爲了快速測試 -

std::vector<Integer> arr{Integer(1), Integer(4), Integer(3)}; 
sort(arr.begin(), arr.end()); 

// now print Integer_count 
相關問題