Loading...
zlobjul avatar zlobjul 4 Точки

Изчистване на char-ове от символен низ

Добро утро,

Направих следната функция за да изчистя char-овете от string , така че да останат само цифрите :

vector<int> eraseNoise(string inputString){

vector<string> subStrings;
string word;
stringstream stream(inputString);

while ( stream >> word ){
        subStrings.push_back(word);
}

int num = 0;

for (int i = 0; i < subStrings.size(); i++) {
        for (int q = 0; q<subStrings[i].length(); q++)
            if (!isdigit(subStrings[i][q])) {
                subStrings[i].erase(subStrings[i].begin() + q);
        }
    }
for (int z = 0; z<subStrings.size();z++ ) {
    cout << "subString[" << z << "]=" << subStrings[z] << endl;
}

vector<int>Result;

for (auto &s : subStrings) {
    stringstream parser(s);
    int x = 0;

    parser >> x;

    Result.push_back(x);
}

return Result;
}

Подавайки input: 5a3 1f a0aaaa f1fg3

Излиза output :

subString[0]=53

subString[1]=1

subString[2]=0aa

subString[3]=1g3

Защо не работи с subString[2]=0aa и subString[3]=1g3 ?

Благодаря !

 

Тагове:
0
C++ Fundamentals
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки
Best Answer

Здравей,

Ти си си коригирал кода, но нека го формулирам малко по-конкретно. Ако се движиш с цикъл (където имаш примерно i++) по поредица от неща, ако изтриеш елемента на позиция i, всички други елементи се преместват с един наляво и ти "прескачаш" следващия символ, защото той вече не е на позиция i + 1, а на позиция i, на която вече се намираш. Затова и в примера ти за всяка поредица, "прескачаш" през един символ когато триеш.

Кодът, който си дал в друг коментар, е един добър вариант да решиш проблема. Има и друг вариант - вместо да триеш елементи от string, създаваш нов string който съдържа само елементите, които няма да изтриеш (това важи и ако имаш числа и искаш да изтриеш някои от тях, само че тогава ще пишеш във вектор).

Примерно:

string digitsAndLetters = "1eqd32adfds2";

ostringstream digitsOnly;

for (int i = 0; i < digitsAndLetters.size(); i++) {
  if (isdigit(digitsAndLetters[i])) {
    digitsOnly << digitsAndLetters[i];
  }
}

string numberStr = digitsOnly.str();

// после ако искаш да го ползваш като число:
int number;
istringstream numberStrIn(numberStr);
numberStrIn >> number;

Този вариант е по-добър от гледна точка на бързодействие от твоя, защото в твоя, всеки път когато триеш елемент, C++ трябва да премести всички други елементи с 1 наляво. Тоест ако имаш 7 елемента, и само последният е цифра, ще имаш следните операции:

- изтрий 0 елемент. Елементите от 1 до 6 се местят с позиция наляво, това са общо 6 операции (по една за всеки елемент)

- изтрий 1 елемент. Още 5 операции за местене

- изтрий 2 елемент. Още 4 операции за местене

...

Тоест накрая ще имаш 6 + 5 + 4 + 3 + 2 + 1 операции. Това за голям string е започва да става бавно. Варианта, който аз предлагам, прави по точно 1 операция на всяка стъпка, защото той не мести елементи, а само взема елементите, които му трябват, и ги слага другаде (също е и по-лесен за четене, защото има само 1 цикъл и е лесно да се разбере какво се случва).

Разбира се, моя вариант ползва и малко повече памет, но в повечето (но не всички) случаи тази памет ще е незначителна спрямо входните данни.

Поздрави,

Жоро

1
zlobjul avatar zlobjul 4 Точки

разбрах какво правя - глупост , първо изтривам символ , после трия позицията като я дефинирам - началото ( което се е променило ) + q.

0
03/12/2017 10:37:45
zlobjul avatar zlobjul 4 Точки

Направих го по следния начин :

for (int i = 0; i < subStrings.size(); i++) {
        int q = 0;
        while ( q < subStrings[i].size() ) {
            if (!isdigit(subStrings[i][q])) {
                subStrings[i].erase(subStrings[i].begin() + q);
            } else {
            ++q;
            }
        }
}

увеличаваме брояча само ако не трием елемент .

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.