簡體   English   中英

如何從C ++中的向量中刪除重復項(具有原始值)

[英]how to remove duplicates (with original value) from a vector in c++

我編寫了程序,以從給定的數字集中刪除重復項。 但是我沒有得到所需的輸出,而是每次都收到SIGSTP運行時錯誤。 輸入/輸出格式如下:輸入:1 2 5 7 1 4 2輸出:5 7 4我的代碼如下:

#include <iostream>
#include<string>
#include <vector>
using namespace std;

int main() {
    // your code goes here
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        cin >> n;
        vector<int> v_num;
        for(int i=0;i<n;i++)
        {
            int x;
            cin >> x;
            v_num.push_back(x);
       }
       vector<int>::iterator it;
       for(it=v_num.begin();it!=v_num.end();)
       {
           int val=*it;
           int flag=0;
           vector<int>:: iterator j;
           for(j=it+1;j!=v_num.end();)
           {
               if(val==*j)
               {
                   v_num.erase(j);
                   flag=1;
               }
               if(flag==0)
                  j++;
           }
           if(flag==1)
                { v_num.erase(it);
                 flag=1;}
           if(flag==0)
                 it++;
       }

        for(int i=0;i<v_num.size();i++)
           { cout <<v_num[i]<<endl;
            }
    }

}

這是我在在線平台上遇到的第一個問題,因此有時我可能不清楚。 在這種情況下,需要的任何建議或進一步的說明都可以張貼在評​​論部分。 提前致謝。

代碼的問題是,您擦除了Elements並在以后使用迭代器。

例如

       for(j=it+1;j!=v_num.end();)
       {
           if(val==*j)
           {
               v_num.erase(j);

我只是從您的代碼中復制並粘貼了它。 您擦除j並在下一次迭代中再次使用it ,這很可能是無效的

從向量中擦除會使迭代器無效。

這是應該使用std::list而不是std::vector

您確實不應該使用這樣的向量。 從向量的中間擦除會導致它每次都重新分配以下所有值。 屆時,所有迭代器都將變為無效,這可能會導致運行時錯誤。

簡而言之,當您在向量上調用erase時,它的迭代器itj變為無效,因此不應使用。

您可以使用std::unique或簡單地使用std::set來存儲開頭的唯一值,避免一起使用向量,因為您只讀取了上面幾行中的值。

您可能需要這樣的東西

vector<int> vec{1,1,2,3,4,4,2,5,6};
sort(begin(vec), end(vec));
auto last = unique(begin(vec), end(vec));
vec.erase(last, end(vec));

使std :: unique工作范圍應事先排序

編輯:我看到我沒有完成所需的問題,因為我在看其他答案。 我設法編寫了一個函數以返回具有唯一數字的向量,但是它分配了臨時計數數組,並最終從向量中復制了唯一的元素。 任何對此表示贊賞。

template<typename T>
std::vector<T> erase_duplicated(const std::vector<T>& vec)
{
    const size_t n = vec.size();
    int* duplicates = new int[n];
    for(size_t i = 0; i < n; ++i) duplicates[i] = 0;

    for(size_t i = 0; i < n; ++i)
    {
        for(size_t j = i + 1; j < n; ++j)
            if(vec[i] == vec[j])
            {
               ++duplicates[i];
               ++duplicates[j];
            }
    }
    std::vector<T> temp;
    for(size_t i = 0; i < n; ++i)
    {
        if(!duplicates[i])
            temp.push_back(vec[i]);
    }
    delete [] duplicates;
    return temp;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM