将唯一值移到左侧并删除字符串

时间:2018-02-17 04:17:30

标签: c++

我正在尝试编写一个函数,它接受字符串中的唯一值,将它们一起移到左边,然后将重复的值设置为空字符串。我希望我的函数返回多少个值被更改为空字符串。

我的阵列是     {“cindy”,“sasha”,“cindy”,“daisy”,“bear”,“bear”,“bear”};但我所拥有的代码似乎只是跳过“熊”而只返回2.

例如,我不能这样做

int duplicaterase(string array[], int  n)
{
const auto end = array + n;
auto finish = end;
for (auto start = array; start != finish; ++start) {
    finish = std::remove(start+1, finish, *start);
}
std::fill(finish, end, std::string());
return static_cast<int>(end - finish);;
}

3 个答案:

答案 0 :(得分:3)

这可以使用for循环中的remove简单地完成:

auto finish = end(duplicates1);

for(auto start = begin(duplicates1); start != finish; ++start) finish = remove(next(start), finish, *start);
fill(finish, end(duplicates1), string());

Live Example

上述解决方案保留了订单,但真正最快的解决方案是sort并使用unique

sort(begin(duplicates1), end(duplicates1));
fill(unique(begin(duplicates1), end(duplicates1)), end(duplicates1), string());

Live Example

答案 1 :(得分:3)

跟随Jonathan Mee的回答,这是一种C ++方式。

#include <algorithm>
int removeDuplicatedValues(string array[], int  n)
{
    const auto end = array + n;
    auto finish = end;
    for (auto start = array; start != finish; ++start) {
        finish = std::remove(start+1, finish, *start);
    }
    std::fill(finish, end, std::string());
    return static_cast<int>(end - finish);;
}

答案 2 :(得分:0)

从第4位移开第2只熊后,第3只熊移动到那个位置,然后你继续从第5位开始寻找熊,你错过了它。尝试将if替换为while,以便在递增j之前继续移除空头。