Подтвердить что ты не робот

Как удалить все вхождения строки char в С++

Я использую следующее:

replace (str1.begin(), str1.end(), 'a' , '')

Но это дает ошибку компиляции.

4b9b3361

Ответ 1

В принципе, replace заменяет символ другим, а '' не является символом. Вы ищете erase.

См. этот вопрос, который отвечает на ту же проблему. В вашем случае:

#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());

Или используйте boost, если это опция для вас, например:

#include <boost/algorithm/string.hpp>
boost::erase_all(str, "a");

Все это хорошо документировано в ссылка веб-сайты. Но если вы не знали об этих функциях, вы могли бы легко сделать это вручную:

std::string output;
output.reserve(str.size()); // optional, avoids buffer reallocations in the loop
for(size_t i = 0; i < str.size(); ++i)
  if(str[i] != 'a') output += str[i];

Ответ 2

Алгоритм std::replace работает за элемент в заданной последовательности (поэтому он заменяет элементы разными элементами и не может заменить его ничем). Но нет пустого символа. Если вы хотите удалить элементы из последовательности, необходимо перемещать следующие элементы, а std::replace не работает так.

Вы можете попытаться использовать std::remove (вместе с std::erase), чтобы достичь этого.

str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());

Ответ 3

Использование copy_if:

#include <string>
#include <iostream>
#include <algorithm>
int main() {
    std::string s1 = "a1a2b3c4a5";
    char s2[256];
    std::copy_if(s1.begin(), s1.end() + 1, s2, [](char c){return c!='a';});
    std::cout << s2 << std::endl;
    return 0;
}

Ответ 4

string RemoveChar(string str, char c) 
{
   string result;
   for (size_t i = 0; i < str.size(); i++) 
   {
          char currentChar = str[i];
          if (currentChar != c)
              result += currentChar;
   }
       return result;
}

Вот как я это сделал.

Или вы могли бы сделать, как сказал Антуан:

Смотрите этот вопроскоторый отвечает на ту же проблему. В вашем случае:

#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());

Ответ 5

Этот код удаляет повторение charecters, т.е. если вход является aaabbcc, тогда вывод будет abc.

cin >> s;
ans = "";
ans += s[0];
for(int i = 1;i < s.length();++i)
if(s[i] != s[i-1])
    ans += s[i];
cout << ans << endl;

Ответ 6

Я предполагаю, что метод std: remove работает, но он дал некоторую проблему совместимости с включенными, поэтому я в конечном итоге написал эту небольшую функцию:

string removeCharsFromString(const string str, char* charsToRemove )
{
    char c[str.length()+1]; // + terminating char
    const char *p = str.c_str();
    unsigned int z=0, size = str.length();
    unsigned int x;
    bool rem=false;

    for(x=0; x<size; x++)
    {
        rem = false;
        for (unsigned int i = 0; charsToRemove[i] != 0; i++)
        {
            if (charsToRemove[i] == p[x])
            {
                rem = true;
                break;
            }
        }
        if (rem == false) c[z++] = p[x];
    }

    c[z] = '\0';
    return string(c);
}

Просто используйте

myString = removeCharsFromString (myString, "abc\r" );

и он удалит все вхождения данного списка char.

Это также может быть немного более эффективным, поскольку цикл возвращается после первого совпадения, поэтому мы фактически делаем меньшее сравнение.

Ответ 7

Вот как я это делаю:

std::string removeAll(std::string str, char c) {
    size_t offset = 0;
    size_t size = str.size();

    size_t i = 0;
    while (i < size - offset) {
        if (str[i + offset] == c) {
            offset++;
        }

        if (offset != 0) {
            str[i] = str[i + offset];
        }

        i++;
    }

    str.resize(size - offset);
    return str;
}

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

Ответ 8

#include <string>
#include <algorithm>
std::string str = "YourString";
char chars[] = {'Y', 'S'};
str.erase (std::remove(str.begin(), str.end(), chars[i]), str.end());

Удалит капитал Y и S из str, оставив "ourtring".

Обратите внимание, что remove является алгоритмом и нуждается в заголовке <algorithm>.