2015-11-22 51 views
-2

我有兩個C++中的數組,長度相同。我想要得到兩個新數組:第一個新數組將具有第一個原始數組的唯一元素,而第二個新數組的第二個原始數組中的相應值。例如:在C++中保存一個數組的獨特元素

原件:

第一:1 7 2 3 5 4 4 8 9 9 4 6 7

第二:1 1 1 2 2 2 3 3 3 4 4 5 5

和我想獲得:

第一:1 7 2 3 5 4 8 9 6

第二:1 1 1 1 2 2 3 3 5

也許我可以使用散列表,但不太清楚如何去做。任何類型的解決方案都很好。先謝謝您的幫助。

+1

是否要保留原始數組中的元素順序? –

+0

你的數組有多大,常見?如果它像數十個元素一樣,只需使用連續表示('std :: vector'或者理想情況下優化以避免在這種小的情況下免費存儲)就可以做得更好。如果它更大,則使用'std :: set'。哦,安東說什麼 - 你想保留插入順序? –

+0

關於downvotes和close的投票,這個問題可能很有趣(除非它只是精確地調用'std :: set',例如),但是你必須更明確地陳述你的需求。不要灰心 - 嘗試編輯問題以使其更加明確。另一個是數據約束 - 它們總是整數嗎?如果是這樣,在一個狹窄的範圍內? –

回答

2

這裏是代表相當普遍的類型的解決方案的兩種方法:

  1. 做對的單一陣列和排序+ uniquify說:

    int a[N], b[N]; // ... your data 
    
    std::vector<std::pair<int, int>> v({{a[0], b[0]}, /*...*/, {a[N-1], b[N-1]}}); 
    
    std::sort(
        v.begin(), v.end(), 
        [](const auto & lhs, const auto & rhs) { return lhs.first < rhs.first; }); 
    auto it = std::unique(
        v.begin(), v.end(), 
        [](const auto & lhs, const auto & rhs) { return lhs.first == rhs.first;}); 
    v.erase(it, v.end()); 
    

    現在的a唯一值是v[i].firsti[0, v.size()),以及b的相應條目分別是v[i].second

  2. 排序和uniquify經由間接索引的數組:

    std::vector<std::size_t> idx({0, 1, 2, /* ... */, N - 1}); 
    
    std::sort(
        idx.begin(), idx.end(), 
        [&a](std::size_t i, std::size_t j) { return a[i] < a[j]; }); 
    auto it = std::unique(
        v.begin(), v.end(), 
        [&a](std::size_t i, std::size_t j) { return a[i] == a[j]; }); 
    v.erase(it, v.end()); 
    

    現在的a唯一值是在[0, v.size())a[idx[i]]對於i,和b的相應值是在b[idx[i]]

+0

非常感謝您的回覆。我試圖使用第一個版本,但是我從我的編譯器(Dev-C++)中得到錯誤。第一個是[Error]沒有用於調用'std :: vector > :: vector(<括號內含的初始化程序列表>)'的匹配函數。我是C++新手,我不明白這個錯誤,我試圖修復它,但沒有成功。你能否提供一個提示如何使它運行?再次感謝。 – km1234

+0

@ km1234:代碼使用[當代C++](https:// ideone。com/Zc1OgJ)(C++ 14);如果你的編譯器不支持它,你需要修改代碼到相應的C++ 03表單。 –

相關問題