Количество чисел в строке

Написать программу на c++ в с стиле с++ (не си) программу которая подсчитывает количество и цифры, и числа в строке. Я только знаю как подсчитывать цифры в строке, как написать что бы виделись так же и целочисленный числа?

 #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
          string str;
        int s=0;
        cout <<"Enter string:";
        getline (cin,str);
        for (unsigned int i = 0 ; i<str.length();i++)
              {
                  if  (isdigit(str[i]))
                  s++;
              }
                       {
                         cout <<"Kollichestvo="<<s<<endl;
                       }


           return 0 ;
    }

Можно, с некоторыми оговорками, например, так:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
    string str;
    int s = 0;
    cout << "Enter string: ";
    getline(cin, str);
    for (unsigned int i = 0; i < str.length(); i++) {
        if (isdigit(str[i]))
            s++;
    }
    cout << "Number of digits = " << s << endl;

    istringstream iss(str);
    if (s > 0) {
        s = 0;
        long num;
        while (!iss.eof()) {
            iss >> num;
            s++;
        }
    }
    cout << "Number of numbers = " << s << endl;

    return 0;
}

Кстати, «количество» пишется с одним «л». А вообще лучше не мешать в одну кучу английский с транслитом. Дико смотрится.

А если уж совсем по хардкорному, то так:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    string str;
    cout << "Enter string: ";
    getline(cin, str);

    cout << "Number of digits = " << count_if(str.begin(), str.end(), isdigit) << endl;

    int s = 0;
    auto digits_begin = find_if(str.begin(), str.end(), isdigit);
    auto digits_end = find_if_not(digits_begin, str.end(), isdigit);
    while (digits_begin != str.end()) {
        s++;
        digits_begin = find_if(digits_end, str.end(), isdigit);
        digits_end = find_if_not(digits_begin, str.end(), isdigit);
    }
    cout << "Number of numbers = " << s << endl;

    return 0;
}

Я тут еще подумал над задачкой и родился вариант более оптимальный, чем первый:

    size_t d = 0,   // количество цифр
           n = 0;   // количество чисел
    bool in_digit = false;
    for (unsigned int i = 0; i < str.length(); i++) {
        if (isdigit(str[i])) {
            d++;
            if (!in_digit) {
                n++;
                in_digit = true;
            }
        }
        else {
            in_digit = false;
        }
    }

И проверил эти три реализации по скорострельности. Visual Studio 2017 Community.
Если компилить без оптимизации, самый бытрый — последний вариант, самый медленный — хардкорный.
Если компилить с оптимизацией, самый быстрый — последний вариант, самый медленный — первый.
Т.е. если запилить ручками, то все-таки быстрее получается, чем с использованием алгоритмов из STL.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.