2017-09-02 107 views
-5

我是新来的。我不明白if语句:i == 0,它消除了重复。怎么运行的?谢谢。有人可以解释这个C++代码吗?

vector<string>words; 
for (string temp; cin >> temp;) 
words.push_back(temp); 
cout << "Number of words:" << words.size() << '\n'; 
sort(words); 
for (int i = 0; i < words.size(); ++i) 
    if (i == 0 || words[i - 1] != words[i]) 
     cout << words[i] << '\n'; 
+0

只有当单词[i - 1]!=单词[i]' - 它与前一个不同时,它才会打印单词。 'i == 0'只是保护 - 因为索引0没有前一个。 –

+3

请选择[一本好的初学C++书](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 [[使用名称空间标准;'是一个不好的做法](https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice)! – tambre

+0

在调试器中使用一组已知输入字符串(包括一些不止一次使用的单词)运行它,并查看在单步执行最后一个循环时发生了什么。 – WhozCraig

回答

0

如果i等于0,那么你可以不看字[I-1],因为你不能这样做的话[-1]

此外,当您使用||运营商,如果第一个表达式为真,第二个表达式不检查

随着i == 0 || words[i - 1] != words[i]可以打印你的第一个字,因为我等于0和表达words[i - 1] != words[i]不检查,不你的程序崩溃! 然后我与0不同,第一个表达式不是真的,第二个检查。


对于unrepetition部分:

你的数组进行排序,所以相同字是一个接一个。 然后,你必须检查前一个词是不一样的,你可以打印字


如何words[i - 1] != words[i]作品:

为的std :: string,运营商==!=认准长度每个字符串,字符串中的每个字符

Comparison operator for std::string

此外,words[i-1]找以前的话,的为目前的一个,来比较它们。

所以在这里,如果两个连续的单词在长度和字母上不相同,则表达式为真。 如果您的阵列中的字dogcatcatcat_dog是第一印刷(因为i == 0部分的),第二个字被印刷cat,则epression是假,因为字是相同的("cat" == "cat"),和finaly,cat_因为不同于cat

+0

感谢您的回复。你能解释单词[i - 1]!=单词[i]是如何工作的吗?如果我输入:狗一只猫一块石头 – zen

+0

试过ti解释它,如果它不清楚,或者如果你有更多的问题,请不要犹豫 –

-1

看起来像您的程序打印的第一个单词,以及每个其他单词不在重复排序的单词列表中。如果您正在尝试寻找唯一的单词,请尝试使用std::unique

0

该程序首先将vector的所有单词排序为strings,并仅打印唯一的单词。

i==0意味着第一个字,因为你不能在第一个字前面任何如果当前词是比较所以它永远是唯一的(从先前并不存在的话)

word[i-1]!=word[i]检查不同于以前的那个字打印。

||Logical Or运营商。

相关问题