0

嗨,我必须以向量格式的向量存储下面提到的信息...

 vector <vector <int>> ph;
 vector<int> p, q;
 p.push_back(1);
 p.push_back(2);
 p.push_back(3);

 q.push_back(10);
 q.push_back(20);
 q.push_back(30);
 q.push_back(40); 

现在而不是使用:

 ph.push_back(p);
 ph.push_back(q);

我想使用:

 ph.at(0)=p
 ph.at(1)=q

(这是我在使用它时遇到的错误:在抛出 'std::out_of_range' what(): vector::_M_range_check 的实例后调用终止)

我想以这种方式存储它的原因是......稍后我想访问由其索引标识的特定向量的元素,即 1 或 0。

例如,我希望访问 ph[0].size() 即 p 的大小...由其索引标识。也就是说,我想执行与我们在 C++ 中的简单数组情况下能够执行的操作相同的操作,即将该数组中的数据存储在特定索引处并从特定索引访问数据。

4

3 回答 3

2

您收到错误是因为当您实例化向量的向量时,它的大小为 0,并且at()允许该方法进行绑定检查并引发异常。

如果您想通过这样的索引访问,那么最好使用std::mapstd::unordered_map。这使得索引独立于插入顺序:

std::map<int, std::vector<int>> MapOfVectors;
std::vector<int> p, q;
// fill vectors
MapOfVectors[1] = q;
MapOfVectors[0] = p;

否则,您必须确保您的向量向量足够大以按索引插入元素:

// instantiate vector with size 2. You can insert p and q by index. (0, 1) only
vector<vector<int>> ph(2); 

或者,在创建后调整大小:

vector<vector<int>> ph;
ph.resize(2);
于 2012-05-31T05:35:33.710 回答
0

我想使用:

ph.at(0)=p  ph.at(1)=q 

这试图访问数组末尾之后的索引,因此出现异常。

我想以这种方式存储它的原因是....稍后我想访问由其索引标识的特定向量的元素,即 1 或 0。

例如,我希望访问 ph[0].size() 即 p 的大小...由其索引标识。也就是说,我想执行与 c++ 中简单数组相同的操作,即将该数组中的数据存储在特定索引处,并从特定索引访问数据。

您可以通过首先用空的内部向量填充外部向量来实现此目的:

vector<vector<int> > ph(2);

在这里,2表示构造外部向量以包含 2 个默认构造的元素(它们本身vector<int>)。

或者,您可以使用:

vector<vector<int> > ph;
ph.resize(2);

完成此操作后,访问元素以存储非默认构造值将是安全的。这意味着以下内容不会抛出:

ph.at(0)=p;  ph.at(1)=q;
于 2012-05-31T05:44:32.250 回答
0

当你定义vector<vector<int>> ph向量ph是空的。当.at()您尝试写入不存在的元素时,成员函数会进行边界检查并正确抛出异常。

您可以这样ph.resize(2)做,然后索引 0-1 将是有效的,或者push_back就像您现在一样使用。

于 2012-05-31T05:40:02.773 回答