2015-11-22 56 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表单。 –

相关问题