不明白为什么C ++程序不产生输出

时间:2017-03-07 04:03:29

标签: c++

我正在研究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;
}

2 个答案:

答案 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();   
}