c ++删除数组

时间:2016-02-16 10:03:33

标签: c++ arrays

编辑:非常感谢大家,songyuanyao回答了我的问题,你们做了大声笑,但我不知道你提出的一些代码,我很快就会知道他们会再学习:)再次感谢。

我真的有一个关于删除字符串中重复名称的问题,请注意,这对于c ++来说是相当新的,反正我会明白这一点。 我想要做的是删除数组中的重复名称,下面的代码工作正常但这是我面临的问题。 例如,我输入了4个名字:( Hana,Alex,Hana,Alex)我想得到的结果只是:(Hana和Alex)而其他2个名字应该被移除但是我得到的是什么(Hana,Alex,Alex) )。 我真的很困惑我应该怎么做才能解决这个问题,我希望它能检查清单中的每个名字,提前谢谢:)。

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
string nurse[4];
int i, n=3, j, k, num;
int main()
{
cout << "Please Enter names to add to the list --->";
for (i = 0; i <= n; i++)
{
    cin >> nurse[i];
}

for (int i = 0; i < n; i++)
{
    for (j = i + 1; j < n;)
        if (nurse[j] == nurse[i])
        {
            for (k = j; k < n; k++)
            {
                nurse[k] = nurse[k + 1];

            }
            n--;
        }
        else
        {
            j++;
        }
}
cout << "Printing list after removing duplicated names" << endl;
for (i = 0; i <= n; i++)
    cout << " "<<nurse[i] << endl;

system("pause");
return 0;
}

4 个答案:

答案 0 :(得分:3)

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

// ...

vector<string> nurses;
nurses.push_back("Hana");
nurses.push_back("Alex");
nurses.push_back("Hana");
nurses.push_back("Alex");
sort(nurses.begin(), nurses.end());
const vector<string>::iterator it = unique(nurses.begin(), nurses.end());
nurses.erase(it, nurses.end());

答案 1 :(得分:3)

假设您从

开始
vector<string> v{"alex", "emma", "alex"};

使用以下项目定义unordered_set

unordered_set<string> h;

现在使用erase-remove idiom使用

[&h](const string &s){return !h.insert(s).second;};

这将在(预期)线性时间内完成工作。

完整示例:

#include <string>                                                                                                                                                                                            
#include<vector>
#include <unordered_set>
#include <algorithm>


using namespace std;


int main()
{
    vector<string> v{"alex", "emma", "alex"};
    unordered_set<string> h;

    auto r = [&h](const string &s){return !h.insert(s).second;};

    v.erase(remove_if(begin(v), end(v), r), end(v));
}

答案 2 :(得分:1)

您实际上并非从阵列中删除名称。你只是转移它们,以防同名来临!

您实际上可以使用std::set,它会自动为您执行此操作!

std::set< std::string > nurses;
std::string nurse;
for (i = 0; i <= n; i++)
{
    std::cin >> nurse;
    nurses.insert( nurse );
}

不要忘记在代码中加入<set>

答案 3 :(得分:1)

for中的条件比元素的数量少一个,因此根本不会检查最后一个元素。

for (int i = 0; i <= n; i++)
                   ~
{
    for (j = i + 1; j <= n;)
                       ~
        if (nurse[j] == nurse[i])
        {
            for (k = j; k <= n; k++)
                           ~
            {
                nurse[k] = nurse[k + 1];

            }
            n--;
        }
        else
        {
            j++;
        }
}