您好我必须将以下提到的信息存储在矢量格式的矢量中......
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 ++中的简单数组相同的操作,即将数据存储在特定索引的数组中,并从特定索引访问数据。
答案 0 :(得分:2)
您收到错误是因为当您实例化向量向量时,它的大小为0,并允许at()
方法进行绑定检查并引发异常。
如果您希望通过索引进行访问,那么您最好使用std::map或std::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;