[英]Deleting string elements in C++
我必須輸入一個整數,然后輸入一個帶有n個元素的字符串,整數類型; 任務是刪除重復元素。 我試圖用此代碼解決問題,但不知道錯誤在哪里。 你能幫助我嗎?
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n, br=0;
string masiv;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>masiv[i];
}
n=masiv.size();
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(masiv[i]==masiv[j] && i!=j)
{
masiv.erase (std::remove(masiv.begin(), masiv.end(), masiv[i]), masiv.end());
}
}
}
cout<<masiv<<endl;
system("pause");
return 0;
}
使用此代碼代替:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n, br=0;
string masiv="";
cin>>n;
for(int i=0;i<n;i++)
{
char c;
cin>>c;
masiv += c;
}
n=masiv.size();
string result="";
for(int i=0;i<n;i++)
{
bool repeated = false;
for(int j=0;j<result.size();j++)
{
if(masiv[i]==result[j])
{
repeated = true; // indicating that massiv[i] was added before
}
}
if(repeated == false)
{
result += masiv[i]; // won't add masiv[i] to the result unless it's the first time encountered
}
}
cout<<result<<endl;
system("pause");
return 0;
}
首先,您應該將輸入讀取為字符,然后使用push_back()
將讀取的字符保存到字符串中。
cin>>n;
for(int i=0;i<n;i++)
{
char c;
cin>>c;
masiv.push_back(c);
}
之所以會出現分段錯誤,是因為將字符串的大小保存為值n( n=masiv.size();
),這是不應該的,因為一旦從字符串中刪除了元素,其大小就會改變。 因此,您應該對循環邊界使用size()
方法,如下所示。
for(int i=0;i<masiv.size();i++)
{
for(int j=0;j<masiv.size();j++)
{
if(masiv[i]==masiv[j] && i!=j)
{
masiv.erase(j, 1);
j--;
}
}
}
看到一個簡單的erase()
方法? 只需擦除重復的元素(后一個)。 j
指定重復元素的索引,並且1
指定將從該索引開始刪除的字符數。 您必須遞減j
因為一旦刪除了第j個索引處的字符,現在j就會指向下一個字符。 當內部循環繼續時,它將遞增j
。 如果在擦除字符后未調整索引,則在循環遞增時將跳過字符。 您必須調整j
使其指向正確的索引。 因此j--;
。
編輯:更好的循環
您可以以不必檢查i==j
的方式重新安排循環。 剛開始時,內部循環索引僅比外部循環索引大1。
for(int i=0;i<masiv.size();i++)
{
for(int j=i+1;j<masiv.size();j++)
{
if(masiv[i]==masiv[j])
{
masiv.erase(j--, 1);
}
}
}
假設您已輸入level
作為字符串。 外循環從l
開始,內循環從e
開始。 通過這種方式,您可以減少迭代次數,並保證不比較相同的索引。
#include <iostream>
#include <string>
#include <algorithm> // std::unique, std::distance
#include <cassert>
int main(int argc, char** argv)
{
std::string masiv;
int n;
std::cin >> n;
assert( n > 0);
std::cin.ignore(10,'\n'); // ignore
std::getline(std::cin,masiv);
masiv.resize(n);
std::string::iterator it = std::unique (masiv.begin(), masiv.end());
masiv.resize( std::distance(masiv.begin(),it) );
std::cout << masiv << std::endl;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.