我想用这段代码对字符串数组进行排序:
void sort(string scadena[]){
string temp;
//here i am intenting sort the elements. it works fine
for(int i=0;i<m;i++){
for(int j=i+1;j<m;j++){
if(scadena[i]>scadena[j]){
temp=scadena[i];
scadena[i]=scadena[j];
scadena[j]=temp;
}
}
}
// Here i am intenting remove the repeated elements, but it not works fine.
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
if(scadena[i]==scadena[j] && j!=i){
for(int k=j;k <m; k++){
scadena[k]=scadena[k+1];
}
m--;
}
}
}
//Because when i do the cout, the output has repeated elements. it not works
for(int i=0;i<m;i++){
cout<<i<<") "<<scadena[i]<<endl;
}
}
输出有重复的元素,但我不知道为什么。
完整的代码有一个函数来进行字符串的排列。
我不会发生什么。
答案 0 :(得分:3)
编辑我刚刚看到这是作业。无论如何,一旦你完成了这个,这是一个惯用的C ++方式来排序字符串向量,并删除重复:
#include <algorithm> // for sort and unique
#include <vector>
#include <string>
....
std::vector<std::string> strings = ....;
std::sort(std::begin(strings), std::end(strings));
auto it = std::unique(std::begin(strings), std::end(strings));
strings.erase(it, std::end(strings);
答案 1 :(得分:3)
主要问题是当你从数组中删除一个元素时,你不应该递增j索引,因为当前索引处的字符串会发生变化,所以你需要再次检查它。
你可以通过在递减m的同时递减j来解决这个问题。
此外,看起来你在删除循环中超出了数组的末尾。
for(int k=j;k <m; k++){
scadena[k]=scadena[k+1];
}
请注意,当k到达最后一次迭代(即k = m-1)时,您将从超过结束的位置m进行复制。
两个修复程序的更新循环应如下所示:
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
if(scadena[i]==scadena[j] && j!=i){
for(int k=j;k+1 <m; k++){
scadena[k]=scadena[k+1];
}
m--;
j--;
}
}
}
答案 2 :(得分:1)
如果排序正常,那么您不需要遍历i
和j
来比较字符串。您只需要遍历一个索引并与下一个字符串进行比较。然后,如果它们相等则删除下一个字符串,并且只有当它们不同时才增加索引。
以下是一些伪代码:
int i=0;
while(i+1<m)
{
if(scadena[i]==scadena[i+1])
{
// Delete scadena[i+1]
.......
m--;
}
else
i++;
}
答案 3 :(得分:0)
您可以修改循环体中的n循环上限,这可能是您遇到问题的原因,
所以删除行
m--;
并跟踪另一个变量中剩余的字符串数 当你编写一个保持停止条件稳定的循环时,这是一个常见的好习惯。
答案 4 :(得分:0)
这应该有效!
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
if(scadena[i]==scadena[j] && j!=i){
for(int k=j;k <(m-1); k++){
scadena[k]=scadena[k+1];
}
}
}
}