#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <string>
struct LR0Item{
string lhs;
vector<string> rhs;
int dpos;
};
map<string,vector<string> > NTmap;
for(map<string,vector<string> >::iterator it=NTmap.begin(); it!=NTmap.end();++it){
string lhs = it->first;
vector<vector<string> > &L = it->second; //?????
for(unsigned i=0;i<L.size();i++){ //?????
vector<string> &rhs = L[i]; //?????
我在上面发布了我的代码,整个程序太冗长而无法包含。
我的问题主要与第一和第三个“评论”有关。
vector<vector<string> > &L = it->second;
我不确定这是说什么,是不是说将存储在它的矢量 - >第二个复制到一个名为L的矢量中?我也不确定'&amp; L'在说什么。
vector<string> &rhs = L[i];
这是同样的情况,这是从L [i]到rhs的复制向量吗?
这些是创建矢量rhs和矢量L还是它们假设它们已经创建了矢量。每次循环时创建一个向量的重点是什么,只是为了能够遍历地图的内部工作?
我的第二条评论:
for(unsigned i=0;i<L.size();i++){
我想知道这个循环实际上是循环的,如果我有一个来自它的向量 - >第二个,存储到它自己的向量L中,这个循环是否循环遍历内向量中的每个字符串?
P.S。这是一个教师的伪代码,我试图理解它。
答案 0 :(得分:0)
L
和rhs
不是向量,它们是引用到向量。这就是&
的含义。所以
vector<vector<string> > &L = it->second;
使L
引用存储在it->second
的向量。所以稍后在撰写L.size()
时,它与写it->second.size()
的效果相同。
与您所说的主要区别在于,在您进行参考时,不会复制任何内容,也不会创建任何内容。您只是引用现有对象。