我使用以下:
replace (str1.begin(), str1.end(), 'a' , '')
但这会导致编译错误。
基本上,replace
用另一个替换一个角色,而''
不是一个角色。你要找的是erase
。
请参阅this question,它回答了同样的问题。在你的情况下:
#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
或者使用boost
,如果这是你的选择,例如:
#include <boost/algorithm/string.hpp>
boost::erase_all(str, "a");
所有这些都在reference websites上有详细记载。但是如果你不知道这些功能,你可以轻松地手工完成这类工作:
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
(together with std::erase
)来实现这一目标。
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
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;
}
这就是我做到的。
或者你可以像Antoine所说的那样做:
请参阅this question,它回答了同样的问题。在你的情况下:
#include <algorithm> 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(), s2, [](char c){return c!='a';});
std::cout << s2 << std::endl;
return 0;
}
这段代码删除了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;
如果您有predicate
和/或非空output
来填充过滤后的字符串,我会考虑:
output.reserve(str.size() + output.size());
std::copy_if(str.cbegin(),
str.cend(),
std::back_inserter(output),
predicate});
在原始问题中,谓词是[](char c){return c != 'a';}
我想方法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重定位到正确的索引。我不知道这是正确还是有效,我在C ++开始(再次),我很感激任何输入。
#include <string>
#include <algorithm>
std::string str = "YourString";
char chars[] = {'Y', 'S'};
str.erase (std::remove(str.begin(), str.end(), chars[i]), str.end());
将从str移除大写Y和S,留下“ourtring”。
请注意,remove
是一种算法,需要包含头部<algorithm>
。