初学者在C++中对向量和while循环有困难

Beginner difficulty with vectors and while-loops in C++

本文关键字:循环 while 向量 C++ 初学者      更新时间:2023-10-16

更新:

所以事实证明有两个问题:

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

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

源语言:

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

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

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

我确定有一个明显的错误,但在过去的 8 个小时里,我一直在到处寻找(毫不夸张),只是致力于自己寻找错误。但我不能。

int main() {
    vector<string> warray; string wentry; int k = 0;
    cout << "Enter words and I'll alphabetize and delete repeats:nn";
    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,检查会再次开始。

打印单词,直到索引贯穿并检查数组中的所有单词。

然后我们等待新条目,尽管上面的代码有点麻烦,因为排序是在检查之前完成的。然而,这显然不是我关心的问题。我只打算让它工作一次。

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

在你采取的点

warray[k - 1]

第一次,k 为零,所以你想在索引 -1 处获取 warray 值,这不一定在内存中定义(即使这样,我也不会这样做)。因此,在编译时,我想地址是在您的案例中偶然定义的。

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

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

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

那行得通吗?

你被困在while循环中,因为你没有办法打破它。话虽如此,您可以使用 Ctrl + d(如果在命令提示符下的窗口上执行,则使用 Ctrl + z)来脱离循环并继续执行代码。

至于底部打印出值的排序向量的 while 循环,您的程序将按照 user902384 的建议崩溃,因为您的程序将首先检查 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])。

你只需要反转:

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. 删除所有重复项。

.cpp文件中包含<set>,并创建一个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