Jump to content
xtrm0

Duvida string::erase

Recommended Posts

xtrm0

Olá. O seguinte bocado de código apaga-me a string toda em vez de apagar apenas os primeiro caracteres nao alfabeticos. O que está mal?

string out = ":_.-.--....Rock_On_..."
    for (int q=0; q<out.size() && !isalpha(out[q]); q++) {
        out.erase(q);
    }


<Signature goes here>

Share this post


Link to post
Share on other sites
kurayama

Quando queres apagar coisas numa string n deves aceder assim aos elementos, se apagas o primeiro elemento, o array puxa todos os elementos para a esquerda, se incrementas a variavel e acedes a essa posição não estás realmente a aceder ao elemento a seguir..

O melhor seria usar iterators

std::string out = ":_.-.--....Rock_On_...";
for(std::string::iterator q = out.begin() ; q != out.end() && !isalpha(*q)
  q = out.erase(q);

Share this post


Link to post
Share on other sites
xtrm0

Obrigado. Mas como é que faço para fazer o mesmo a partir do final da string.

Assim dá Segmentation Fault:

for(std::string::iterator q = out.end()-1 ; q != out.begin() && !isalpha(*q)
      q = out.erase(q);


<Signature goes here>

Share this post


Link to post
Share on other sites
kurayama

Do fim para o inicio já podes usar o for que é mais simples.

Quando apagas no fim, não há o deslocamento como acontece se apagares no inicio/meio.

Share this post


Link to post
Share on other sites
mogers

Deste uma olhadela à descrição da classe string? http://www.cplusplus.com/reference/string/string/

Para percorrer do fim para o início, devias usar o rbegin e o rend (r de reverse)

http://www.cplusplus.com/reference/string/string/rbegin/

http://www.cplusplus.com/reference/string/string/rend/

E o erase está também descrito http://www.cplusplus.com/reference/string/string/erase/ com os respectivos valores de retorno e exemplo


"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Share this post


Link to post
Share on other sites
kurayama

isso obriga a usar o reverse_iterator, que não pode ser usado no erase. É mais confuso..

Share this post


Link to post
Share on other sites
xtrm0

Não entendo, fiz o mesmo dos iterators nesta funcao e nao dá.

it é o iterator

N é um vector com string

hip é um vector com numeros que correspondem a posições de strings em N

seq é um string

for (it = hip.begin(); it!=hip.end(); ++it) {
        if (N[*it][count]!=seq[count]) {
            it = hip.erase(it);
        }
}


<Signature goes here>

Share this post


Link to post
Share on other sites
pikax

Não entendo, fiz o mesmo dos iterators nesta funcao e nao dá.

it é o iterator

N é um vector com string

hip é um vector com numeros que correspondem a posições de strings em N

seq é um string

for (it = hip.begin(); it!=hip.end(); ++it) {
        if (N[*it][count]!=seq[count]) {
            it = hip.erase(it);
        }
}

porque que não simplificas o código, podes guardar a string do vector e depois comparar, por exemplo:

for(vector<string>::iterator iter=vecString.begin();iter!=vecString.end();++iter)
{	temp=*iter;
	string::iterator iter3;

	for(string::iterator iter2=strings.begin(),iter3=temp.begin();iter2!=strings.end();++iter2,++iter3)
		if(*iter2!=*iter3 && iter3!=temp.end())
		{
			temp.erase(iter3);
		}
	*iter=temp;
}

Deixo um exemplo que fiz à presa:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
vector<string> vecString;
string strings("koizo");
string temp;

vecString.push_back("koi2z1o");
vecString.push_back("k1oiz2o");
vecString.push_back("ko2izo");
vecString.push_back("koi3zo");
vecString.push_back("koiz4o");
vecString.push_back("koizo");
vecString.push_back("k6oizo");
vecString.push_back("ko7izo");



for(vector<string>::iterator iter=vecString.begin();iter!=vecString.end();++iter)
{	temp=*iter;
	string::iterator iter3;

	for(string::iterator iter2=strings.begin(),iter3=temp.begin();iter2!=strings.end();++iter2,++iter3)
		if(*iter2!=*iter3 && iter3!=temp.end())
		{
			temp.erase(iter3);
		}
	*iter=temp;
}

for(vector<string>::iterator iter=vecString.begin();iter!=vecString.end();++iter)
	cout<<*iter<<endl;
}


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
xtrm0

Não estás a perceber. Eu não quero comparar a string inteira, apenas o ultimo caracter. Mas no código que fiz dá-me erro. seg fault


<Signature goes here>

Share this post


Link to post
Share on other sites
pikax

string str1("abcdefg");
string str2("akjsdhgashgd");

if(str1.at(str1.size()-1)==str2.at(str2.size()-1))
   return 1;
else
  return 0;

Algo assim do género??  😲

EDIT:

Se quiseres apagar o ultimo carácter é só:

string str1("abcdefg");
string str2("akjsdhgashgdg");

if(str1.at(str1.size()-1)==str2.at(str2.size()-1))
{
cout<<str2<<endl;
str2.erase(str2.size()-1);
cout<<str2<<endl;
}
else
  cout<<0;


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
xtrm0

N. Quero apagar uma string completamente (remove-la do vetor), se o caracter com a mesma distancia do inicio da string que o ultimo caracter de seq for diferente do ultimo caracter de sequencia.


<Signature goes here>

Share this post


Link to post
Share on other sites
pikax

N. Quero apagar uma string completamente (remove-la do vetor), se o caracter com a mesma distancia do inicio da string que o ultimo caracter de seq for diferente do ultimo caracter de sequencia.

Não percebi muito bem o que querias, mas se queres apagar um valor no vector, podes fazer assim:

for(vector<string>::iterator iter=vecString.begin();iter!=vecString.end();++iter)
{	temp=*iter;

	for(string::iterator iter2=strings.begin(),iter3=temp.begin();iter2!=strings.end();++iter2,++iter3)
		if(*iter2!=*iter3 && iter3!=temp.end())//esta parte mudas para o que qeres
		{
			vecString.erase(iter);//apagar a string do vector
			break;
		}

}


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites
xtrm0

Eu pervebi o teu codigo, mas não é isso que eu quero.

Eu tenho por exemplo a palavra seq="12347"

E tenho um vector com as palavras:

"0023723","123465","12347","000000"

Deste vector seriam apagadas 123465 e 000000, visto que o caracter delas cuja posicao corresponde ao tamanho de seq(5) é diferente do ultimo caracter de seq(7).

7=7

6!=7

7=7

0!=7


<Signature goes here>

Share this post


Link to post
Share on other sites
pikax

Eu pervebi o teu codigo, mas não é isso que eu quero.

Eu tenho por exemplo a palavra seq="12347"

E tenho um vector com as palavras:

"0023723","123465","12347","000000"

Deste vector seriam apagadas 123465 e 000000, visto que o caracter delas cuja posicao corresponde ao tamanho de seq(5) é diferente do ultimo caracter de seq(7).

7=7

6!=7

7=7

0!=7

é isto??

#include<iostream>
#include<vector>
using namespace std;

int main()
{
vector<string> vecString;
string strings("12347");
string temp;

vecString.push_back("0023723");
vecString.push_back("123465");
vecString.push_back("12347");
vecString.push_back("000000");


for(vector<string>::iterator iter=vecString.begin();iter!=vecString.end();++iter)
{	temp=*iter;

	if(temp.at(strings.size()-1)==strings.at(strings.size()-1))
	{
		vecString.erase(iter);
	}

}

for(vector<string>::iterator iter=vecString.begin();iter!=vecString.end();++iter)
	cout<<*iter<<endl;
}

Só tive que fazer umas modificações e tá a funcionar.


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.