我正在研究Accelerated C ++练习3-3,我不能为我的生活弄清楚为什么我的程序不产生输出。我甚至试图在途中添加测试cout但它并没有给我任何东西。当我在main for循环之外添加一个cout语句时,为什么它根本不会产生任何输出?
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
#include <vector>
using std::cout; using std::cin;
using std::endl; using std::vector;
using std::sort; using std::string;
int main() {
int count = 0;
string input;
vector<string> words;
typedef vector<string>::size_type vec_sz;
vec_sz size = words.size();
cout << "Sentence: ";
while(cin >> input) {
words.push_back(input);
}
for(int i = 0; i < size - 1; i++) {
for(int j = 0; j < size - 1; j++) {
if(words[i] == words[j]) {
++count;
}
}
cout << "The word " << words[i] << " appears " << count << " times." << endl;
}
return 0;
}
答案 0 :(得分:2)
您可以检查wp_quantum_sales
。因此,size == 0
- 循环中没有任何迭代。
要解决此问题,您需要将行for
移动几行。
尝试此订单:
vec_sz size = words.size();
在你的cout << "Sentence: ";
while(cin >> input) {
words.push_back(input);
}
vec_sz size = words.size();
- 循环中也存在错误。您需要每次重置for
(只需在内部循环之前添加count
即可获得正确的结果)。
您可以在此处查看其工作原理:http://ideone.com/T2cPcH(初始化count = 0;
时出错)
答案 1 :(得分:1)
在中插入任何内容之前,读取大小变量。因此,在您阅读它时,它的值为0。如果要将它放到底部的for循环中,则循环将运行,而不是迭代0 < (0 - 1)
为假。
您可以取消size
变量。 vector::size
是一个恒定时间操作。调用它没有任何开销。
此外,我更改了您从cin
读取行的方式。现在它将使用std::getline
读取该行。该行可以在一行上有多个单词,因此它使用stringstream
读取行外的每个单词并将其插入到向量中。
还有另一个名为multiset
的容器,可以更好地满足您的需求。
更好的方法是使用unordered_dict
,可用于保存每个字符串的计数。它的工作原理是因为当您在unordered_map
中插入新条目时,它的int值将默认为0,因此您可以安全地始终对其应用增量操作。
以下示例。
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <set>
#include <unordered_map>
// don't do this in a header file!!
using namespace std;
void basic()
{
string input;
vector<string> words;
cout << "Sentence: ";
if(std::getline(std::cin, input))
{
istringstream ss(input);
string word;
while(ss >> word){
words.push_back(word);
}
}
for(const auto& word: words) {
int count = 0;
for(const auto& word2: words) {
if(word == word2) {
++count;
}
}
cout << "The word " << word << " appears " << count << " times.\n";
}
}
void better()
{
multiset<string> ms;
string input;
cout << "Sentence: ";
if(std::getline(std::cin, input))
{
istringstream ss(input);
string word;
while(ss >> word){
ms.insert(word);
}
}
for(auto it = ms.begin(), end = ms.end();
it != end;
it = ms.upper_bound(*it))
{
cout << *it << "'count=" << ms.count(*it) << '\n';
}
}
void best()
{
unordered_map<string, int> counter;
string input;
cout << "Sentence: ";
if(std::getline(std::cin, input))
{
istringstream ss(input);
string word;
while(ss >> word){
counter[word]++;
}
}
for(const auto& it: counter)
{
cout << it.first << "'count=" << it.second << '\n';
}
}
int main()
{
//basic();
//better();
best();
}