2015-02-23 44 views
0

所以我有一個構造函數,看起來像 HNS :: HNS vector >> storage(1000,vector>(1000));訪問嵌套的STL結構和大小調用

我也有一個函數來插入元素,看起來像

void HNS::insert(const string& host, const int& ip) { 
    hash<HostName> hash; 
    auto resultno = hash(host); 
    auto result = resultno%size; 
    cout << "size of current container is : " << (storage.at(result)).size() << endl; 

    storage.at(result).emplace_back(host, ip); 
} 

但是,在運行時,它的emplace_back和cout電話給我超出範圍異常。 在構造函數中,我可以打印storage.at(600).size(),但在插入函數中,cout和emplace調用失敗。任何想法爲什麼這是?

問候

+3

*編譯時,emplace_back函數在運行時會給我一個超出範圍的異常*什麼? – Borgleader 2015-02-23 19:59:56

+0

我認爲這是因爲我沒有正確定義存儲。它需要是全球性的。我如何去做這件事? – enrm 2015-02-23 20:04:02

+2

@enrm'resultno%size''size'在你發佈的代碼中來自哪裏? – PaulMcKenzie 2015-02-23 20:05:30

回答

0

我不知道這是否會改正錯誤,但你沒有職位的代碼有缺陷,足以使可能出現超出範圍的異常。

您的代碼有問題,因爲它從不檢查result是否在範圍內。您也不檢查storage是否爲空(一個矢量可以很容易清除,因此您的聲明不會告訴我們在執行代碼之前可能發生了什麼)。

一個更安全的實現應該是這樣的:

void HNS::insert(const HostName& host, const IPAddress& ip) 
{ 
    if (storage.empty()) 
     return; 

    hash<HostName> hash; 
    auto resultno = hash(host); 
    auto result = resultno % size; 
    result = std::min(result, storage.size() - 1); 
    cout << "size of current container is : " << (storage.at(result)).size() << endl; 
    storage.at(result).emplace_back(host, ip); 
} 

現在你保證result不會超出範圍。