2013-03-18 69 views
8

我正在采取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); 
    } 
} 
+0

你有一个载体在那里。你的代码有什么问题? – 2013-03-18 19:05:24

+1

@AndyProwl越界访问(假设代码是真实的代码)。 – juanchopanza 2013-03-18 19:06:44

+0

@juanchopanza:哦,对:)好赶上 – 2013-03-18 19:09:09

回答

5

呦可以用大小ruleNum

vector <vector<string> > big(ruleNum); 

的矢量这将持有ruleNumvector<string>元素开始。您可以将元素推回到每个元素中,就像您在发布的示例中所做的那样。

10

代码是正确的,但你的向量中没有元素,所以你不能访问big[i]

设置循环前的矢量大小,无论是在构造函数或像这样:

big.resize(ruleNum); 

或者,你可以在每个循环一步推空载体:

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

你不还需要围绕big[i]的括号。

3

你可以做到以下几点:

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); 
} 
+0

不需要在外部循环外面声明'buf',实际上你忘记在循环内清除它,因为那。 – 2013-03-18 19:28:00

+0

@KonradRudolph你说得对,我很粗心,代码刚刚更新。谢谢! – taocp 2013-03-18 19:29:13

+0

哈哈,现在你做了不必要的工作,每次都重新定义向量,因此是空的,不需要“清除”它。 – 2013-03-18 19:31:34

1
   vector<vector<string> > v; 

到的push_back为载体的载体,我们将在的push_back内部矢量串并的push_back内部矢量到外部载体。

显示其实现的简单代码:enter code here vector> v; vector 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);