Quel est le moyen préféré pour supprimer des espaces d'une chaîne en C++? Je pourrais parcourir tous les personnages et créer une nouvelle chaîne, mais existe-t-il un meilleur moyen?
La meilleure chose à faire est d'utiliser l'algorithme remove_if
et isspace:
_remove_if(str.begin(), str.end(), isspace);
_
Maintenant, l'algorithme lui-même ne peut pas changer le conteneur (seulement modifier les valeurs), donc il mélange les valeurs et renvoie un pointeur sur l'endroit où devrait se trouver la fin. Nous devons donc appeler string :: erase pour modifier réellement la longueur du conteneur:
_str.erase(remove_if(str.begin(), str.end(), isspace), str.end());
_
Nous devrions également noter que remove_if fera au plus une copie des données. Voici un exemple d'implémentation:
_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;
}
_
std::string::iterator end_pos = std::remove(str.begin(), str.end(), ' ');
str.erase(end_pos, str.end());
De gamedev
string.erase(std::remove_if(string.begin(), string.end(), std::isspace), string.end());
Pouvez-vous utiliser Boost String Algo? http://www.boost.org/doc/libs/1_35_0/doc/html/string_algo/usage.html#id129057
erase_all(str, " ");
Pour le rognage, utilisez algorithmes de chaîne de renforcement :
#include <boost/algorithm/string.hpp>
using namespace std;
using namespace boost;
// ...
string str1(" hello world! ");
trim(str1); // str1 == "hello world!"
Vous pouvez utiliser cette solution pour supprimer un caractère:
#include <algorithm>
#include <string>
using namespace std;
str.erase(remove(str.begin(), str.end(), char_to_remove), str.end());
Salut, tu peux faire quelque chose comme ça. Cette fonction supprime tous les espaces.
string delSpaces(string &str)
{
str.erase(std::remove(str.begin(), str.end(), ' '), str.end());
return str;
}
J'ai créé une autre fonction, qui supprime tous les espaces inutiles.
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;
}
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);
}
utilise le:
string replace = replaceinString(thisstring, " ", "%20");
string replace2 = replaceinString(thisstring, " ", "-");
string replace3 = replaceinString(thisstring, " ", "+");
Si vous voulez faire cela avec une macro facile, en voici une:
#define REMOVE_SPACES(x) x.erase(std::remove(x.begin(), x.end(), ' '), x.end())
Cela suppose que vous ayez fait #include <string>
bien sûr.
Appelez ça comme ça:
std::string sName = " Example Name ";
REMOVE_SPACES(sName);
printf("%s",sName.c_str()); // requires #include <stdio.h>
J'ai utilisé le travail ci-dessous pendant longtemps - pas sûr de sa complexité.
s.erase(std::unique(s.begin(),s.end(),[](char s,char f){return (f==' '||s==' ');}),s.end());
lorsque vous voulez supprimer le caractère ' '
et certains par exemple -
, utilisez
s.erase(std::unique(s.begin(),s.end(),[](char s,char f){return ((f==' '||s==' ')||(f=='-'||s=='-'));}),s.end());
de même, il suffit d'augmenter le ||
si le nombre de caractères à supprimer n'est pas 1
mais comme mentionné par d'autres l'effacement supprimer idiome semble également bien.
string removeSpaces(string Word) {
string newWord;
for (int i = 0; i < Word.length(); i++) {
if (Word[i] != ' ') {
newWord += Word[i];
}
}
return newWord;
}
Ce code prend essentiellement une chaîne et effectue une itération sur tous ses caractères. Il vérifie ensuite si cette chaîne est un espace blanc. Si ce n'est pas le cas, le caractère est ajouté à une nouvelle chaîne.
string removespace(string str)
{
int m = str.length();
int i=0;
while(i<m)
{
while(str[i] == 32)
str.erase(i,1);
i++;
}
}