初学者在C++中对向量和while循环有困难
Beginner difficulty with vectors and while-loops in C++
更新:
所以事实证明有两个问题:
首先是我在检查 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<>
是一个很好的容器,可以满足你当前的两个条件:
- 按字母顺序对
strings
进行排序。 - 删除所有重复项。
在.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
。
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- while循环中while循环的时间复杂度是多少
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 擦除while循环中迭代的元素
- 为什么我不能在 while 循环中创建线程?
- 退出简单while循环时出现问题
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 嵌套While循环不起作用(C++问题)
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 使用 GMP 的 while 循环出现问题
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 为什么在 while 循环中返回表达式不起作用
- 如何使用 do while 循环确定最高值和最低值
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- OpenCV QT,显示视频的帧(不使用while循环)
- 输入循环 while 函数
- c++中的循环(while)
- 为什么这段代码没有循环(while)