C ++ Vector By Reference

时间:2013-12-07 07:57:23

标签: c++ vector pass-by-reference declaration

#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。这是一个教师的伪代码,我试图理解它。

1 个答案:

答案 0 :(得分:0)

Lrhs不是向量,它们是引用到向量。这就是&的含义。所以

vector<vector<string> > &L = it->second;

使L引用存储在it->second的向量。所以稍后在撰写L.size()时,它与写it->second.size()的效果相同。

与您所说的主要区别在于,在您进行参考时,不会复制任何内容,也不会创建任何内容。您只是引用现有对象。