Вопросы относительно строки C ++ - PullRequest
1 голос
/ 14 марта 2019
phrase.erase(remove_if (phrase.begin(), phrase.end(), ::isdigit), phrase.end());

В приведенном выше коде, почему я должен использовать ::, хотя я использовал using namespace std?

#include "Palindrome.h"
#include <iostream>
#include <string.h>
#include <algorithm>

using namespace std;

Palindrome::Palindrome (string Phrase){
    phrase=Phrase;
}

void Palindrome::removeNonLetters()
{
    phrase.erase(remove_if (phrase.begin(), phrase.end(), ::isdigit), phrase.end());

    phrase.erase(remove_if (phrase.begin(), phrase.end(), ::ispunct), phrase.end());

    phrase.erase(remove_if (phrase.begin(), phrase.end(), ::isspace), phrase.end());
}

void Palindrome::lowerCase()
{
    for (int i=0; i<phrase.length(); i++)
    {
        phrase[i] = tolower(phrase[i]); 
    }
}

bool Palindrome::isPalindrome()
{
    int length=phrase.length(); 
    int a=0;    
    for (int i=0;i<length/2;i++)
    { 
        if(phrase[i] != phrase[length-a-1])
        {
            return false;
            break;
        }
        a++;
    }
    return true;
}

Приведенный выше код проверяет, является ли строка палиндромом.Я не понимаю, почему мне нужно использовать первую часть, которая

Palindrome::Palindrome (string Phrase){
    phrase=Phrase;
}

Я всегда получу "да", если я удалю вышеуказанную часть.

Тестовый код в main

if(test.Palindrome::isPalindrome() == 1){
    cout<<"Yes"<<endl;
}
else {
    cout<<"No"<<endl;
}

Еще один вопрос.Я пытаюсь изменить нижний регистр приведенного выше кода, я получил ошибку.Кто-нибудь знает, что с ним происходит?Новый код был от https://www.geeksforgeeks.org/conversion-whole-string-uppercase-lowercase-using-stl-c/

До

 void Palindrome::lowerCase()
{
    for (int i=0; i<phrase.length(); i++)
    {
        phrase[i] = tolower(phrase[i]); 
    }
}

После

void Palindrome::lowerCase(){

transform(phrase.begin(), phrase.end(), phrase.begin, ::tolower);

}

Кто-нибудь может мне это объяснить?Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Существует несколько функций isdigit, ispunct и isspace - функции в глобальном пространстве имен в заголовке <ctype.h> и несколько функций в пространстве std в заголовках <cctype> и <clocale> , Префикс с :: говорит о том, что вы хотите использовать те из глобального пространства имен.

Вам нужно использовать <string> вместо <string.h>, чтобы использовать std::string класс.

Если предположить, что test является Palindrome объектом, тогда test.Palindrome::isPalindrome() должно быть просто test.isPalindrome().

Если вы опустите конструктор Palindrome, то элемент phrase останется пустым, и ваша реализация isPalindrome() вернет true для пустого phrase (length равно 0), потому что для ничего нет for цикл для проверки. Что технически правильно - пустая строка - палиндром.

0 голосов
/ 14 марта 2019

:: указывает, что вы используете isdigit и другие из глобального пространства имен. isdigit является частью других заголовочных файлов, таких как <ctype.h>.

...