Remove spaces from std::string in C++
在C ++中从字符串中删除空格的首选方法是什么? 我可以遍历所有字符并构建一个新字符串,但是有更好的方法吗?
最好的办法是使用算法remove_if和isspace:
1
| remove_if(str.begin(), str.end(), isspace); |
现在,算法本身无法更改容器(只能修改值),因此它实际上将值随机改组并返回一个指向现在应该结束的指针。因此,我们必须调用string :: erase来实际修改容器的长度:
1
| str.erase(remove_if(str.begin(), str.end(), isspace), str.end()); |
我们还应注意,remove_if将最多复制一份数据。这是一个示例实现:
1 2 3 4 5 6 7 8 9
| template<typename T, typename P>
T remove_if(T beg, T end, P pred)
{
T dest = beg;
for (T itr = beg;itr != end; ++itr)
if (!pred(*itr))
*(dest++) = *itr;
return dest;
} |
1 2
| std::string::iterator end_pos = std::remove(str.begin(), str.end(), ' ');
str.erase(end_pos, str.end()); |
来自gamedev
1
| string.erase(std::remove_if(string.begin(), string.end(), std::isspace), string.end()); |
可以使用Boost String Algo吗? http://www.boost.org/doc/libs/1_35_0/doc/html/string_algo/usage.html#id1290573
您可以使用以下解决方案删除字符:
1 2 3 4 5
| #include
#include <string>
using namespace std;
str.erase(remove(str.begin(), str.end(), char_to_remove), str.end()); |
要进行修剪,请使用升压字符串算法:
1 2 3 4 5 6 7 8 9
| #include <boost/algorithm/string.hpp>
using namespace std;
using namespace boost;
// ...
string str1(" hello world!");
trim(str1); // str1 =="hello world!" |
嗨,您可以做类似的事情。此功能删除所有空格。
1 2 3 4 5
| string delSpaces(string &str)
{
str.erase(std::remove(str.begin(), str.end(), ' '), str.end());
return str;
} |
我做了另一个功能,删除了所有不必要的空格。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| string delUnnecessary(string &str)
{
int size = str.length();
for(int j = 0; j<=size; j++)
{
for(int i = 0; i <=j; i++)
{
if(str[i] == ' ' && str[i+1] == ' ')
{
str.erase(str.begin() + i);
}
else if(str[0]== ' ')
{
str.erase(str.begin());
}
else if(str[i] == '\0' && str[i-1]== ' ')
{
str.erase(str.end() - 1);
}
}
}
return str;
} |
1 2 3 4 5 6 7 8 9
| string replaceinString(std::string str, std::string tofind, std::string toreplace)
{
size_t position = 0;
for ( position = str.find(tofind); position != std::string::npos; position = str.find(tofind,position) )
{
str.replace(position ,1, toreplace);
}
return(str);
} |
用它:
1 2 3
| string replace = replaceinString(thisstring,"","%20");
string replace2 = replaceinString(thisstring,"","-");
string replace3 = replaceinString(thisstring,"","+"); |
如果要使用一个简单的宏来执行此操作,请执行以下操作:
1
| #define REMOVE_SPACES(x) x.erase(std::remove(x.begin(), x.end(), ' '), x.end()) |
假设您当然已经完成了#include 。
这样称呼它:
1 2 3
| std::string sName =" Example Name";
REMOVE_SPACES(sName);
printf("%s",sName.c_str()); // requires #include <stdio.h> |
我长时间使用以下解决方法-不确定其复杂性。
s.erase(std::unique(s.begin(),s.end(),[](char s,char f){return (f==' '||s==' ');}),s.end());
当您想删除字符' '和某些例如-的字符时
s.erase(std::unique(s.begin(),s.end(),[](char s,char f){return ((f==' '||s==' ')||(f=='-'||s=='-'));}),s.end());
同样,如果要删除的字符数不是1,则只需增加||
但正如其他人所提到的,删除删除成语也不错。
1 2 3 4 5 6 7 8 9 10
| string removeSpaces(string word) {
string newWord;
for (int i = 0; i < word.length(); i++) {
if (word[i] != ' ') {
newWord += word[i];
}
}
return newWord;
} |
这段代码基本上接受一个字符串,并遍历其中的每个字符。然后,它检查该字符串是否为空格,如果不是,则将该字符添加到新字符串中。
1 2 3 4 5 6 7 8 9 10
| #include
using namespace std;
int main() {
.
.
s.erase( remove( s.begin(), s.end(), ' ' ), s.end() );
.
.
} |
资源:
参考来自本论坛。
1 2 3 4 5 6 7 8 9 10 11
| string removespace(string str)
{
int m = str.length();
int i=0;
while(i<m)
{
while(str[i] == 32)
str.erase(i,1);
i++;
}
} |
恐怕这是我能想到的最佳解决方案。但是您可以使用reserve()预先预先分配所需的最小内存,以加快处理速度。您将得到一个可能更短的新字符串,但它占用的内存量相同,但是您将避免重新分配。
编辑:根据您的情况,这可能比使周围的字符杂乱无章地产生更多的开销。
您应该尝试不同的方法,然后查看最适合您的方法:您可能根本没有任何性能问题。
|