【发布时间】:2016-08-12 21:31:15
【问题描述】:
我想删除通过引用字符串传递的第一个和最后一个括号。不幸的是,我很难有条件地删除第一个和最后一个元素。
我不明白为什么 remove_if 不能像我期望的那样使用迭代器。
#include <iostream>
#include <algorithm>
using namespace std;
void print_wo_brackets(string& str){
auto detect_bracket = [](char x){ return(')' == x || '(' == x);};
if (!str.empty())
{
str.erase(std::remove_if(str.begin(), str.begin() + 1, detect_bracket));
}
if (!str.empty())
{
str.erase(std::remove_if(str.end()-1, str.end(), detect_bracket));
}
}
int main()
{
string str = "abc)";
cout << str << endl;
print_wo_brackets(str);
cout << str << endl;
string str2 = "(abc";
cout << str2 << endl;
print_wo_brackets(str2);
cout << str2 << endl;
return 0;
}
输出
abc)
ac <- HERE I expect abc
(abc
abc
【问题讨论】:
-
这个答案可能有用(其他答案也可能适合)stackoverflow.com/a/25385766/3807729
-
基本上,remove_if 不会改变容器的大小。相反,它返回新的结束。您必须手动更新字符串以反映更改。在第一个字符上使用它可能会使字符串变得一团糟。
标签: c++ string algorithm c++11 stl