'std :: out_of_range'what():vector :: _ M_range_check:__n(为0)> = this-> size()(为0)

时间:2018-04-01 03:11:02

标签: c++ vector c++14

我很难弄清楚如何修复此错误。我到处寻找,似乎无法找到解决方案。

我的程序是使用向量向量的键/值对算法。它接受一个键和值,然后将值添加到矢量矢量中位置“key”处的矢量。我使用vPos和vNeg作为向量的向量,并根据密钥是正还是负来使用每个。

size只返回向量向量中'key'位置的序列大小。

数据返回指向位置'key'指定的序列中第一个元素的指针。

insert为位置'key'的序列添加一个新值。

我认为我的私有变量可能没有正确初始化,但我已经尝试了所有可以提出的所有内容,所以感谢任何帮助。

#include <algorithm>
#include <list>
#include <vector>
using namespace std;

class key_value_sequences {
public:
    int size(int key) const{
        if (key < 0){
            return vNeg.at(-key).size();
        }
        return vPos.at(key).size();
    }

    const int* data(int key) const{
    if (key < 0){
        if (vNeg.at(-key).size()==0) return nullptr;
        return vNeg.at(-key).data();
    }
    if (vPos.at(key).size() == 0) return nullptr;
    return vPos.at(key).data();
    }

    void insert(int key, int value){
        if (key < 0){
            vNeg.at(-key).push_back(value);
        }
        else{
        vPos.at(key).push_back(value);
        }
    }

private:
    vector<vector<int>> vPos;
    vector<vector<int>> vNeg;

}; // class key_value_sequences

#endif // A3_HPP

1 个答案:

答案 0 :(得分:0)

您致电vPos.at(N),但您从未在vPos中添加任何内容。错误消息是正确的:您正在索引超出向量的末尾。

你可以这样做:

if (key >= vPos.size()) vPos.resize(key + 1);
vPos.at(key).push_back(value);

然后您知道keyvPos中的有效索引。