如何在一个向量的向量中进行推回?

12

我正在输入20行内容。我想通过空格分隔每一行的内容,并将其放入一个二维向量中。如何创建一个二维向量?我在尝试将其推入向量时遇到了困难...

我的输入文件:

Mary had a little lamb
lalala up the hill
the sun is up

向量应该长成这个样子。

ROW 0: {"Mary","had", "a","little","lamb"}
ROW 1: {"lalala","up","the","hill"}

这是我的代码...

string line; 
vector <vector<string> > big;
string buf;
for (int i = 0; i < 20; i++){
    getline(cin, line);
    stringstream ss(line);

    while (ss >> buf){
        (big[i]).push_back(buf);
    }
}

你那儿有一个向量的向量。你的代码有什么问题? - Andy Prowl
2
@AndyProwl 超出边界访问(假设代码是真实代码的良好表示)。 - juanchopanza
@juanchopanza:哦,没错 :) 发现得好 - Andy Prowl
3
请投票选择《玛丽有只小羊》而不是《foo/bar》。 - lahjaton_j
4个回答

14

代码没问题,但您的向量中没有元素,因此无法访问big[i]

在循环之前设置向量大小,可以在构造函数中或像这样设置:

big.resize(ruleNum);

你也可以在每个循环步骤中推入一个空向量:

big.push_back( vector<string>() );

你也不需要在 big[i] 周围加上括号。


5
你可以从一个大小为ruleNum的向量开始。
vector <vector<string> > big(ruleNum);

这将创建一个包含 ruleNum 个空的 vector<string> 元素的容器。然后,您可以向每个元素中推入元素,就像您当前在发布的示例中所做的那样。

4
您可以执行以下操作:
string line; 
vector <vector<string> > big;  //BTW:In C++11, you can skip the space between > and >

string currStr;
for (int i = 0; i < ruleNum; i++){
    getline(cin, line);
    stringstream ss(line);
    vector<string> buf;
    while (ss >> currStr){
       buf.push_back(buf);
    }
    big.push_back(buf);
}

不需要在外部循环之外声明buf,实际上由于这个原因你忘记在循环内清除它。 - Konrad Rudolph
@KonradRudolph 您是正确的,我太粗心了,代码已经更新。谢谢! - taocp
哈哈,现在你正在做不必要的工作,因为向量每次被重新定义时都是空的,所以没有必要使用 clear() - Konrad Rudolph
@KonradRudolph 再次更新,但在那里加上 clear() 不会影响正确性。我同意这是多余的。谢谢! - taocp
把buf移动到big里面有意义吗?还是说会发生复制省略,所以没有必要这样做? - recodeFuture

3
              vector<vector<string> > v;

向二维向量中进行push_back操作时,我们会将字符串推入内部向量,并将内部向量推入外部向量。

下面是一个简单的代码示例:

vector<vector<string> > v;
vector<string> s;

s.push_back("Stack");
s.push_back("oveflow");`
s.push_back("c++");
// now push_back the entire vector "s" into "v"
v.push_back(s);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接