使用C ++中的向量和while循环的初学者难度

时间:2015-01-24 05:35:20

标签: c++

更新

事实证明有两个问题:

首先是我在检查k == 0之前检查了[k-1]索引。这是一次崩溃,虽然大部分都是可修复的,而不是我发布的主要问题。

主要问题是代码似乎只有在按下ctrl + z后才会执行。不知道为什么会这样。

原始

所以,从C ++编程中的Stroustrup文本中学习,我得到了一个关于向量的例子,并尝试自己实现它。要点是程序用户输入一堆单词,程序按字母顺序排列它们,然后打印它们而不重复。我设法使用 for 语句来获取代码,但我最初的尝试之一让我感到困惑的是为什么这个代码无效。

要明确,我并没有要求改进此代码。我已经有了更好的工作代码。我想知道为什么下面的代码没有工作。

"错误"我得到的是代码编译并运行正常,但是当我输入单词时,没有任何反应,我提示输入更多。

我确定这是一个明显的错误,但我在过去的8个小时里一直在寻找无处不在(毫不夸张)只是为了自己找错误。但我不能。

int main() {
    vector<string> warray; string wentry; int k = 0;
    cout << "Enter words and I'll alphabetize and delete repeats:\n\n";
    while (cin >> wentry) warray.push_back(wentry);
    sort(warray.begin(), warray.end());
    while (k < warray.size()) {
    if (warray[k - 1] != warray[k] || k == 0) cout << warray[k] << "\n";
    ++k;
    }
}

我为什么这应该工作的原因是:我初始化我的单词数组,每个输入的单词输入,以及索引单词输出的变量。

然后我有一个while语句,以便每个输入都堆叠在数组的末尾。

然后我对数组进行排序。

然后我使用从0开始的索引来输出数组的第0项。

然后只要索引中尚未到达数组中的单词,索引就会检查该单词是否不是先前索引位置的重复,然后如果没有则打印。

无论如何,索引都会加1,检查再次开始。

在索引运行之前打印单词并检查数组中的所有单词。

然后我们等待新的条目,虽然这对上面的代码有点麻烦,因为排序是在检查之前完成的。然而,这显然不是我的担忧。我只打算这个工作一次。

4 个答案:

答案 0 :(得分:2)

要结束输入循环,您需要插入ctrl+d的EOF字符。但是,您的代码中还有其他问题。您已经开始k = 0,所以当您尝试warray[k - 1]代码崩溃时。

答案 1 :(得分:2)

在你接受

的时候

warray[k - 1]

第一次,k为零,所以你想得到索引-1处的warray值,这不一定在内存中定义(即使,我也不会这样做)。因此,当它编译时,我想这个地址是在你的情况下偶然定义的。

我会尝试简单地在if条件中反转OR组合:

 if (k == 0 || warray[k - 1] != warray[k])

因此,对于第一次迭代(k == 0),它不会检查第二个条件,因为第一个条件已经满足。

那会有用吗?

答案 2 :(得分:0)

你陷入了while循环,因为你没有办法摆脱它。话虽这么说,你可以使用Ctrl + d(或者如果在命令提示符下的windows上执行,则使用Ctrl + z)来打破循环并继续执行代码。

至于底部的while循环打印出值的排序向量,你的程序将因用户902384建议而崩溃,因为你的程序将首先检查warray [k-1]。

理想情况下,您希望将程序的最后一部分更改为:

while (k < warray.size()) 
{
    if (k == 0 || warray[k - 1] != warray[k]) 
        cout << warray[k] << "\n";
    ++k;
}

这样,k == 0检查通过,你的程序将跳过检查warray [k-1]!= warray [k](当k = 0时,它将等于warray [-1]!= warray [0] )。

答案 3 :(得分:0)

你只需要逆转:

if (warray[k - 1] != warray[k] || k == 0)

if (k == 0 || warray[k - 1] != warray[k] )

如果k = 0,则终止此条件。

另一种选择。

虽然它可以被称为有点偏离主题,但考虑到你想使用std::vector<>,但std::set<>是一个很好的容器,它满足你目前的两个条件:

  1. 按字母顺序对strings进行排序。
  2. 删除所有重复项。
  3. 在您的<set>文件中加入.cpp,并创建一个set对象,insert所有std::string并遍历该集合以获取您的订单,无重复的字符串!

    代码:

    int main() {
       //Define a set container.
       set<string> s;
       //A temporary string variable.
       string temp;
       //Inserting strings into the set.
       while (cin >> temp) s.insert(temp);
       //Create a set<int> iterator.
       set<string>::iterator it;
       //Scanning the set
       for(it = s.begin(); it != s.end(); ++it)
       {
         //To access the element pointed by the iterator,
         //use *it.
         cout<<*it<<endl;
       }
       return 0;
    }
    

    我刚刚推荐了这个容器,因为你将在Stroustrup的文本中学习set,它非常简单方便,而不是在vector上工作。