关于向量和for / while循环的C ++新手

时间:2011-07-26 13:07:34

标签: c++ loops vector for-loop while-loop

我正在尝试制作一些能够从用户那里获取输入的东西,将它们分成矢量中的字符串,然后一次打印一个(每行8个)。 到目前为止,这就是我所拥有的:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

int main(void)
{
    using namespace std;

    vector<string> svec1;
    string temp;
    while(getline(cin, temp)) //stores lines of text in temp
    {
        if(temp.empty()) //checks if temp is empty, exits loop if so.
            break;
        stringstream ss(temp);
        string word;
        while(ss >> word) //takes each word and stores it in a slot on the vector svec1
        {
            svec1.push_back(word);
        }            
    }        
}

我一直坚持让它一次打印8个,我试过的解决方案不断下标超出范围错误。

3 个答案:

答案 0 :(得分:2)

这样的事情:

for(int i = 0; i < svec1.size(); i++)
{
    cout << svec1[i];
    if ((i+1) % 8 == 0)
        cout << endl;
    else
        cout << " ";
}

编辑:
上面的解决方案在最后输出额外的空格/换行符。这可以通过以下方式避免:

for(int i = 0; i < svec1.size(); i++)
{
    if (i == 0)
        /*do nothing or output something at the beginning*/;
    else if (i % 8 == 0)
        cout << endl; /*separator between lines*/
    else
        cout << " "; /*separator between words in line*/
    cout << svec1[i];
}

答案 1 :(得分:0)

使用索引遍历您的向量:

for (unsigned int idx = 0; idx < svec1.size(); ++idx) {
   std::cout << svec[idx] << sep(idx); // sep(idx) is conceptual; described below
}

这是sep(idx)是什么?它是在idx th 字之后打印的分隔符。这是

  • 在一行打印八个单词后的换行符。 idx将是7,15,23等:一个害羞的8的整数倍。在代码中,(idx+1)%8 == 0
  • 向量中最后一项的换行符;您可能希望使用换行符跟随最后一项。在代码idx+1 == svec.size()
  • 否则为空格。

一种简单的方法是使用三元运算符:

for (unsigned int idx = 0; idx < svec1.size(); ++idx) {
   const char * sep = (((idx+1)%8 == 0) || (idx+1 == svec.size())) ? "\n" : " ";
   std::cout << svec[idx] << sep;
}

如果您不喜欢,

for (unsigned int idx = 0; idx < svec1.size(); ++idx) {
   const char * sep;
   if (((idx+1)%8 == 0) || (idx+1 == svec.size())) {
      sep = "\n";
   }
   else {
      sep = " ";
   }
   std::cout << svec[idx] << sep;
}

答案 2 :(得分:-1)

通常使用for循环子句迭代向量。因此,如果您要打印vector<string>的所有元素,您必须制作如下内容:

for(vector<string>::iterator it = myvec.begin(); it != myvec.end(); ++it) {
    cout << *it;
}

编辑:正如Vlad已经正确发布的那样,你也可以使用数组索引,它们在列表中效率较低,但对向量同样有效。