сравнивая элементы вектора - PullRequest
0 голосов
/ 12 декабря 2011

Я новичок в C ++ и могу динамически добавлять слова из файла в векторный массив, но я хочу взять каждое слово и выяснить, сколько раз это слово встречается в файле и печатать слово только один раз.и перечислите номер строки каждый раз, когда это происходит.Я не уверен, куда идти от моего вектора слов.Есть ли способ сравнить каждый строковый элемент?Вот мой исходный код:

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <sstream>#include 
using namespace std;
int main() {
ifstream inFile, testStream;
ofstream outFile; 
vector<string> words; 
string temp, choice, inFileName, outFileName, word, trash; 
int idx = 0, lineCount = 0;
bool outputOpened = false;
stringstream wordStream;    
for (;;) {  
    cout << "Options: "<< endl << "1. Index" << endl << "2. Quit" << endl 
    << "Please enter an option: ";
    getline(cin, temp);
    choice.resize(temp.length());
    transform(temp.begin(), temp.end(), choice.begin(), ::toupper);
    if (choice.compare("INDEX") == 0 || choice.compare("1") == 0) {
        do {
            inFileName.clear();
            cout << "Index Program" << endl
            << "==============" << endl << endl;
            cout << "Input file name: ";
            getline(cin, inFileName);
            inFile.open(inFileName.c_str());
            if(inFile.fail()) {
                cout << "Can't open file" << endl;
                if(inFile.bad()) {
                    cout << "Bad" << endl;
                }
                inFile.clear();
            }
        }
        while (!inFile.is_open());
        do {
            cout << "Output file name: ";
            getline( cin, outFileName);
            testStream.clear();
            testStream.open(outFileName.c_str());
            if(testStream.good()) {
                cout << "That file already exists, try again" << endl;
                testStream.clear();
                testStream.close();
            }
            else {
                testStream.clear();
                testStream.close();
                outFile.open(outFileName.c_str());
                if (outFile.good()) {
                    outputOpened = true;
                }
            }
        }
        while (!outputOpened);
        while (inFile.peek() != EOF) {
            getline(inFile,word, ' ');

            lineCount++;


            words.push_back(word); // now the vector 'words' contains all words in the file
        }
    for (idx = 0; idx < words.size(); idx++) {
        outFile << words[idx] << endl;
    }   
}
else if (choice.compare("QUIT") == 0 || choice.compare("2") == 0) {
return 0;
}
else {
cout << temp << " is an unrecognized option, please try again" << endl;
}
}
return 0;
}

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Вот несколько советов:

  1. вместо vector, рассмотрите возможность использования map - это позволит вам связать счет с данным словом
  2. При вставке слова посмотрите, содержит ли оно карту, если да, увеличьте счет, иначе добавьте новую запись со счетом 1.
  3. В конце выполните итерацию по карте инапечатайте слово и счет

По вашей конкретной проблеме.В std::string реализовано operator==, так что вы можете просто сравнить на равенство, например,

std::string f("foo");
std::string b("bar");

if (f == b)
  std::cout << "foobar" << std::endl;

Некоторые другие подсказки:

Используйте потоковые операции для чтения слова за раз, скореечем peek() для EOF, что-то вроде:

// assume fin is a file input stream
std::string word;

while(fin >> word)
{
  if (!word.empty())
  {
    // do stuff with word...
  }
}
1 голос
/ 12 декабря 2011

Для того, чего вы пытаетесь достичь, есть лучший способ: std :: map . Вы используете карту (как в примере из ссылки) и каждый раз, когда вы хотите добавить новый элемент, вы сначала ищете, если он существует. Если это не так, вы инициализируете его с 1.

yourMap[yourString]=1;

Если строка уже существует, вы увеличиваете этот счетчик:

yourMap[yourString]=1+yourMap[yourString];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...