Я использую следующее:
replace (str1.begin(), str1.end(), 'a' , '')
Но это дает ошибку компиляции.
Я использую следующее:
replace (str1.begin(), str1.end(), 'a' , '')
Но это дает ошибку компиляции.
В принципе, 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];
Алгоритм std::replace
работает за элемент в заданной последовательности (поэтому он заменяет элементы разными элементами и не может заменить его ничем). Но нет пустого символа. Если вы хотите удалить элементы из последовательности, необходимо перемещать следующие элементы, а std::replace
не работает так.
Вы можете попытаться использовать std::remove
(вместе с std::erase
), чтобы достичь этого.
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
Использование 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;
}
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());
Этот код удаляет повторение 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;
Я предполагаю, что метод 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.
Это также может быть немного более эффективным, поскольку цикл возвращается после первого совпадения, поэтому мы фактически делаем меньшее сравнение.
Вот как я это делаю:
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 в правильный индекс. Я не знаю, правильно это или эффективно, я начинаю (еще раз) на С++, и я был бы признателен за любой ввод.
#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>
.