如何通过索引存储矢量矢量

时间:2012-05-31 05:31:39

标签: c++ stl vector

您好我必须将以下提到的信息存储在矢量格式的矢量中......

 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'实例后调用terminate   what():vector :: _ M_range_check)

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

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

您可以执行ph.resize(2),这样索引0-1就可以有效,或者像您当前一样使用push_back

答案 2 :(得分: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;