C++ 删除c+中数组中的重复项+;

C++ 删除c+中数组中的重复项+;,c++,duplicate-removal,C++,Duplicate Removal,如何在不使用任何其他类型的数据结构的情况下删除数组中的重复元素 我只是很难改变一些因素。请帮忙 例如,如果我有这个数组: 字符串arr[]={“helo”、“helo”、“dog”} 如何在C++中得到{HeLo’、“FED”}?< P>。应用于已排序容器的该操作将删除重复项并将迭代器返回到唯一序列的末尾 #include <iostream> #include <algorithm> #include <vector> int main() {

如何在不使用任何其他类型的数据结构的情况下删除数组中的重复元素

我只是很难改变一些因素。请帮忙

例如,如果我有这个数组: 字符串arr[]={“helo”、“helo”、“dog”}


<>如何在C++中得到{HeLo’、“FED”}?

< P>。应用于已排序容器的该操作将删除重复项并将迭代器返回到唯一序列的末尾

#include <iostream>
#include <algorithm>
#include <vector>

int main() 
{
    std::vector<std::string> v{ "helo", "helo", "dog" };
    std::sort( v.begin(), v.end() );
    std::vector<std::string>::iterator last;

    last = std::unique( v.begin(), v.end()); // "dog", "helo", "helo" 
                                            //                  ^
    for ( std::vector<std::string>::iterator it = v.begin(); it != last; ++it) {
        std::cout << *it << " ";
    }
    std::cout << "\n"; // output: dog helo
}
如果要删除唯一元素后面的其余元素,可以删除它们:

std::sort( v.begin(), v.end() );
v.erase( unique( v.begin(), v.end() ), v.end() );

以下是我如何对不想重新排序的未排序数组执行此操作:

// returns how many elements were *removed*
template <typename T>
int RemoveDups (T a [], int n)
{
    int shift = 0;
    for (int i = 1; i < n; ++i)
    {
        int j = i - 1 - shift;
        for ( ; j >= 0; --j)
            if (a[i] == a[j])
                break;
        if (j < 0)  // not a duplicate
            a[i - shift] = std::move(a[i]);
        else
            shift += 1;
    }
    return shift;
}
//返回*删除了多少个元素*
模板
内部删除的ups(T a[],内部n)
{
int-shift=0;
对于(int i=1;i=0;--j)
如果(a[i]==a[j])
打破
if(j<0)//不是重复的
a[i-shift]=std::move(a[i]);
其他的
移位+=1;
}
返回移位;
}
我接受数组作为输入的方式不是最好的方式;改用
std::array
或一对类似迭代器的对象。但我想要最简单的答案

下面是正在发生的事情的描述:

我们维护一个变量
shift
,该变量始终跟踪每个元素需要向后移动的插槽数量,或者等效地跟踪在当前元素之前已经移除的元素数量

从第二个元素开始(因为第一个元素显然不是任何元素的重复),我们将
i
th元素与它前面的所有元素进行比较。如果这个元素不等同于它们中的任何一个,那么这是一个“好”元素,需要保留,所以我们将它移回。否则,我们就把它放在以后要覆盖的地方(或者不覆盖;我们不在乎),只需增加
shift
(因为现在又有一个元素被删除了,需要被跳过)

i
th元素与之前所有元素的比较从
shift
i
之前的位置开始,并向后进行,因为我们知道之前的
shift
元素将被删除,并且不需要(其中所有“好”元素都已被移回)

就这样。该算法的时间复杂度为O(n^2)且稳定

如果您知道元素已经排序,则只能将每个元素与其前面的
shift-1
点进行比较,并在
O(n)
中进行比较


如果您不介意对数据重新排序,您可以首先在
O(n*log(n))
中对它们进行排序,然后使用
O(n)
方法对总共
O(n*log(n))
的数组进行排序还是未排序?您需要维护任何排序吗?你需要保持稳定吗?从数组中删除条目但使其紧密打包的最简单方法是:arr[replace_ind]=arr[--arr_size];
// returns how many elements were *removed*
template <typename T>
int RemoveDups (T a [], int n)
{
    int shift = 0;
    for (int i = 1; i < n; ++i)
    {
        int j = i - 1 - shift;
        for ( ; j >= 0; --j)
            if (a[i] == a[j])
                break;
        if (j < 0)  // not a duplicate
            a[i - shift] = std::move(a[i]);
        else
            shift += 1;
    }
    return shift;
}