2015-02-23 66 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不会超出范围。