Кросс-пост с так функцией палиндрома найти


Я не знал, что этот сайт существует до сих пор... круто!

Я просто сделал тему здесь: https://stackoverflow.com/questions/8511620/c-palindrome-finder-optimization

#include <iostream>
#include <ostream>
#include <vector>
#include <fstream>
#include <algorithm>
using namespace std;

bool isPal(string);

int main()
{
    vector<string> sVec;
    vector<string> sWords;
    vector<string> sTwoWords1;
    vector<string> sTwoWords2;
    char myfile[256]="/home/Damien/Test.txt";
    ifstream fin;
    string str;
    fin.open(myfile);
    if(!fin){
        cout << "fin failed";
        return 0;
    } 
    while(fin){
        fin >> str;
        sWords.push_back(str);
        if(!fin){
            break;
        }
        if(isPal(str)){
            sVec.push_back(str);
        }
        else{
            getline(fin, str);
        }
    }
    reverse(sVec.begin(), sVec.end());
    for(int i =0; i < sVec.size(); i++){ 
        cout << sVec[i] << " is a Palindrome " <<endl;
    } 

    // Test 2 
    for(int i=0; i<sWords.size(); i++)
    {                                         
        for(int j=(i+1); j<sWords.size(); j++){ 
            str = sWords[i]+sWords[j];
            if(isPal(str)){
                sTwoWords1.push_back(sWords[i]);
                sTwoWords2.push_back(sWords[j]);
            }
        }
    }
    fin.close();
    for(int i=0; i<sTwoWords1.size();i++){ 
        cout << sTwoWords1[i] << " and " << sTwoWords2[i] << " are palindromic. \n";
    } 
    return 0;
}
bool isPal(string& testing) {
    return std::equal(testing.begin(), testing.begin() + testing.size() / 2, testing.rbegin());
}

Об оптимизации кода, при условии, что я беру пересмотр моя функция isPal, что еще я могу сделать, чтобы оптимизировать мой код?

Спасибо большое за все рекомендации!

Wordfile: http://www.filedropper.com/ospd3



433
4
c++
задан 14 декабря 2011 в 09:12 Источник Поделиться
Комментарии
2 ответа

Чтения файла:

while(fin){ 

fin >> str;
sWords.push_back(str);
if(!fin){
break;
}

Вы нажимаете на ул. стоимость до проверки он работал. Она должна быть:

while(fin)
{
fin >> str;
if(!fin){
break;
}
sWords.push_back(str);

Или даже лучше будет:

while(fin >> str)
{
sWords.push_back(str);

Почему вы делаете это:

    else{
getline(fin, str);
}

Смешивая оператор >> и вызовом getLine() делает код трудно читать.
Либо использовать все оператор >> или использовать вызовом getLine (), чтобы получить строку после разбора строки внутренне.

Примечание: оператор>> игнорирует '\п' В конце строки и работать. Так что если ваш файл представляет собой список слов по одному в строке нет необходимости пользоваться вызовом getLine(). С другой стороны, если ваш файл будет много текста и вы хотите только первое слово в каждой строке, то вам нужно использовать вызовом getLine().

Метод 1: использование оператора>>

 // If your input file has one word per line (or you want to use all words)
while(file >> word)
{
// Do stuff
}

Метод 1: Используйте вызовом getLine()

 // If your input file contains lots of words
// But you only want to use the first word on each line
while(std::getline(file, line))
{
std::stringstream linestream(line);
linestream >> word;

// Do stuff
}

Вы, кажется, перечеркнув линию просто распечатать его:

reverse(sVec.begin(), sVec.end());                          
for(int i =0; i < sVec.size(); i++){
cout << sVec[i] << " is a Palindrome " <<endl;
}

А не меняет массив, просто перебирать его в обратном порядке:

for(std::vector<std::string>::const_iterator& loop = sVec.rbegin(); loop != sVec.rend(); ++ loop)
{
cout << (*loop) << " is a Palindrome " <<endl;
}

Обратите внимание на эффективность:

С помощью push_back() на вектор может быть эффективной, если вы выдвигаете много данных. А завтра вектор заканчивается оно должно выделить больше памяти и скопировать строку в новый буфер. Вам помочь по предварительной allocting пространства.

sVec.reserve(1000); // Guess at the size
// Note when the vector runs out of space it will approximately
// double its internal buffer.

4
ответ дан 14 декабря 2011 в 09:12 Источник Поделиться

#include <iostream>
#include <ostream>
#include <vector>
#include <fstream>
#include <algorithm>

Ты забыл включать .

using namespace std;

Хотя это может быть приемлемым в книгах и на этом сайте, чтобы сократить строк, не использовать с помощью пространства имен std в реальном коде.

    vector<string> sVec;
vector<string> sWords;
vector<string> sTwoWords1;
vector<string> sTwoWords2;
char myfile[256]="/home/Damien/Test.txt";
ifstream fin;
string str;

Это устаревший стиль. Даже в C, ваш variabled не должна быть больше заявленной в верхней части. Объявлять каждую переменную в строке инициализации.

    char myfile[256]="/home/Damien/Test.txt";

Не использовать char массивы, использовать СТД::струна (или в редких случаях: СТД::вектор).

    ifstream fin;
fin.open(myfile);

Почему две строки, где можно было бы быть достаточно, и почему с помощью функции Open()? Замените его:

    std::ifstream fin(myfile.c_str());

Как мой_файл должны быть СТД::строка.

    while(fin){
fin >> str;
sWords.push_back(str);

Другого ответа уже исправил ошибку в этом утверждении.

    reverse(sVec.begin(), sVec.end());
for(int i =0; i < sVec.size(); i++){

Использовать итераторы для перебора контейнера. В этом случае, использовать обратные итераторы и вам даже не нужно вызывать обратное().

    fin.close();

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

            str = sWords[i]+sWords[j];
if(isPal(str)){

Ошибка! "Ааб" и "АА" окажется пара палиндром, как "aabaa" является палиндромом.

bool isPal(string& testing) {

Что должно быть константной.

bool isPal(string);
....
bool isPal(string& testing) {

Они не совпадут.

    return std::equal(testing.begin(), testing.begin() + testing.size() / 2, testing.rbegin());

Круто! Наконец-то реальный код C++! Даже с std:: присутствует!

3
ответ дан 15 декабря 2011 в 12:12 Источник Поделиться