c++ - func return list<int> with args (int arry[int], int array[int])

标签 c++ visual-studio-2013

我的问题是:

我认为这个算法有效...但是 Visual Studio 2013 给我这个错误:

C2893 未知类型 std::less::operator()(_Ty1 &&,_Ty2 &&) 常量。

我必须创建一个函数,它接受 2 个 int 数组并返回一个列表,其中包含数组的元素,已排序并且没有在列表中重复的元素。

    list<int> sort_array(int *elenco1[C], int *elenco2[C])
{
    list<int> merge1;
    list<int> merge2;

    for (int i = 0; i < C; ++i)
    {
        merge1.push_back(*elenco1[i]);
    }

    for (int i = 0; i < C; ++i)
    {
        merge2.push_back(*elenco2[i]);
    }

    merge1.sort();
    merge2.sort();

    merge1.merge(merge2);

    merge1.sort();

    list<int>::iterator inizio = merge1.begin();
    list<int>::iterator fine = merge1.end();

    for (inizio; inizio != fine; ++inizio)
    {
        for (fine; fine != inizio; --fine)
        {
            if (*fine == *inizio)
            {
                merge1.erase(inizio);
            }
            else{}
        }
    }

    return merge1;
}

int main()
{
    list<int> stampa;

    int* elenco1[C];
    int* elenco2[C];

    for (int i = 1; i <= 5; ++i)
    {
        for (int k = 0; k < C; ++k)
        {
            *elenco1[k] = i;
        }
    }

    for (int i = 5; i <= 9; ++i)
    {
        for (int k = 0; k < C; ++k)
        {
            *elenco1[k] = i;
        }
    }

    stampa = sort_array(elenco1, elenco2);

    list<int>::iterator inizio = stampa.begin();
    list<int>::iterator fine = stampa.end();

    for (inizio; inizio != fine; ++inizio)
    {
        cout << *inizio << " ";
    }

    cout << endl;

    getchar();
    return 0;
}

最佳答案

除非你真的打算以尽可能困难的方式做事,否则使用一些标准算法(可能是 std::vector 而不是 list)。您关心的具体算法是 std::sortstd::unique

基本思想是创建一个包含两个输入 vector 元素的 vector 。对其进行排序,然后使用 std::unique 删除重复项。代码可能看起来像这样:

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

std::vector<int> 
merge_sort_unique(std::vector<int> in1, std::vector<int> const &in2) {
    in1.insert(in1.end(), in2.begin(), in2.end());
    std::sort(in1.begin(), in1.end());
    in1.erase(std::unique(in1.begin(), in1.end()), in1.end());
    return in1;
}

下面是使用它的快速演示:

int main() {
    std::vector<int> in1{ 5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 1 };
    std::vector<int> in2{ 10, 10, 9, 10, 1, 10, 9, 4, 4, 5, 2, 2, 2, 2, 8, 2, 2, 2 };

    std::vector<int> out = merge_sort_unique(in1, in2);

    for (int i : out)
        std::cout << i << "\t";
}

一个简短的说明:因为我们需要输入数据的拷贝,所以我首先按值传递第一个参数,因此它是其中一个输入的拷贝。然后我们将另一个输入的内容复制到它的末尾。然后我们有一个包含所有数据的 vector ,然后我们可以对其进行排序并删除重复项。

这种复制最初可能看起来很浪费,但除非我们被允许修改其中一个输入,否则它确实是必要的。

是的,如果您真的关心节省空间,即使以稍微增加算法复杂性为代价,您当然可以先排序,然后从每个输入中删除重复项,然后合并并删除再次重复。如果您希望有很多重复项,这甚至可能会更快——但您需要对输入数据有相当多的了解才能确定它更快(甚至“不慢”)。

关于c++ - func return list<int> with args (int arry[int], int array[int]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25746060/

相关文章:

c# - GetPixel(ScreenWidth, ScreenHeight) 抛出异常

c++ - SIGSEGV 使用汇编访问数组元素时

c++ - C++虚函数原理

c# - 列表框无法显示子类变量

c++ - Windows 找不到 win_bison.exe

asp.net - 升级到 Visual Studio 2013 后为 "Failed to load resource: the server responded with a status of 401 (Unauthorized)"

c++ - 什么时候允许编译器优化 auto+brace 样式初始化?

c++ 和 boost program_options 错误 : 'desc' does not name a type

c++ - 是否保证为返回 void 的函数调用 std::async?

C++、std::copy 和模板