如何按索引存储向量的向量

how to store vector of vector by index

本文关键字:向量 存储 索引 何按      更新时间:2023-10-16

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

 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"实例后终止调用 什么(): 向量::_M_range_check)

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

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

您会收到错误,因为当您实例化向量的向量时,它的大小为 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);

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

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

我想使用:

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;