关于stl:在C ++中从std :: string删除空格

关于stl:在C ++中从std :: string删除空格

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
erase_all(str,"");

您可以使用以下解决方案删除字符:

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()预先预先分配所需的最小内存,以加快处理速度。您将得到一个可能更短的新字符串,但它占用的内存量相同,但是您将避免重新分配。

编辑:根据您的情况,这可能比使周围的字符杂乱无章地产生更多的开销。

您应该尝试不同的方法,然后查看最适合您的方法:您可能根本没有任何性能问题。


推荐阅读

    linux命令删除用户组?

    linux命令删除用户组?,管理,密码,系统,用户组,用户,概念,命令,文件,管理员,

    linux输出字符串命令?

    linux输出字符串命令?,标准,基础,字符串,资料,简介,商业,数字,系统,命令,汉

    linux删除重复项命令?

    linux删除重复项命令?,数据,系统,工具,电脑,项目,公式,百度,代码,名字,基础,

    linux硬链接删除命令?

    linux硬链接删除命令?,数据,系统,不了,时间,名称,链接,文件,档案,地方,设备,l

    linux交互删除命令?

    linux交互删除命令?,名称,不了,系统,文件夹,命令,通用,文件,目录,指令,方法,l

    linux删除无用的命令?

    linux删除无用的命令?,系统,软件,数据,员工,命令,信息,宽松,对比,状态,公司,L

    删除文件linux命令行?

    删除文件linux命令行?,命令,文件,不了,档案,名称,系统,数据,目录,文件夹,终

    linux命令行删除网卡?

    linux命令行删除网卡?,地址,网络,系统,工具,信息,设备,名字,管理,服务,网卡,l

    linux命令替换的字符?

    linux命令替换的字符?,命令,数据,系统,商业,字符串,文件,内容,方法,批量,字

    linux命令删除字符串?

    linux命令删除字符串?,软件,系统,代码,名称,通用,连续,字符,字符串,命令,空

    linux删除整个命令?

    linux删除整个命令?,命令,文件夹,不了,名称,通用,系统,数据,文件,目录,格式,l

    linux如何命令删除?

    linux如何命令删除?,档案,系统,命令,文件,目录,通用,文件夹,终端,选项,参数,l

    删除路由命令linux?

    删除路由命令linux?,系统,信息,网络,地址,管理,环境,路由,命令,工作,基础,WIN

    linux命令删除当前行?

    linux命令删除当前行?,系统,位置,命令,文件夹,文件,标的,数据,环境,通用,不

    linux命令行字符隐藏?

    linux命令行字符隐藏?,系统,标准,信息,名称,代码,工具,文件夹,命令,文件,语

    linux转换字符集命令?

    linux转换字符集命令?,系统,名称,时间,位置,服务,文件,字符集,命令,格式,以

    linux删除jog命令?

    linux删除jog命令?,工具,软件,连续,机器人,位置,中心,工作,平稳,人员,自动化

    linux删除服务的命令?

    linux删除服务的命令?,服务,系统,软件,平台,名称,管理,环境,产品,命令,文件,

    linux删除rm命令?

    linux删除rm命令?,系统,命令,文件夹,不了,通用,名称,环境,文件,目录,下面,lin

    linux字符动画命令?

    linux字符动画命令?,工作,系统,地址,信息,命令,目录,工具,时间,标准,基础,Lin