更新
事实证明有两个问题:
首先是我在检查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,检查再次开始。
在索引运行之前打印单词并检查数组中的所有单词。
然后我们等待新的条目,虽然这对上面的代码有点麻烦,因为排序是在检查之前完成的。然而,这显然不是我的担忧。我只打算这个工作一次。
答案 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<>
是一个很好的容器,它满足你目前的两个条件:
strings
进行排序。在您的<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
上工作。