我的问题是:
我认为这个算法工作......但是Visual Studio 2013给了我这个错误:
C2893 unknown-type std :: less :: operator()(_ Ty1&&,_ Ty2&&)const。
我必须创建一个带有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;
}
答案 0 :(得分:1)
除非您真的以尽可能困难的方式做事,否则请使用一些标准算法(可能std::vector
代替list
)。您关注的具体算法是std::sort
和std::unique
。
基本思想是创建一个包含两个输入向量元素的向量。对其进行排序,然后使用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";
}
一个快速说明:既然我们需要输入数据的副本,我首先按值传递第一个参数,这样就是其中一个输入的副本。然后,我们将其他输入的内容复制到该末尾。然后我们有一个包含所有数据的向量,然后我们可以对它们进行排序和删除重复。
这种复制最初可能看起来很浪费,但除非我们允许修改其中一个输入,否则它确实是必要的。
是的,如果您真的关心节省空间,即使以更高的算法复杂度为代价,您当然可以先排序,然后从每个输入中删除重复项,然后合并并删除再次重复。如果你期望有很多重复,这甚至可能更快 - 但你需要相当多的输入数据知识,以确保它更快(甚至“不慢”)。 / p>
答案 1 :(得分:0)
在这里编辑也很好VS 2013 ...
由于指向int的指针数组,您的代码将无法正常工作。你需要int数组而不是指向int
的指针数组替换
int *elenco1[C]
带
int elenco[C];
并将星号放在sort_array
中还有更多:
for (fine; fine != inizio; --fine)
{
if (*fine == *inizio)
{
merge1.erase(inizio);
}
}
这里使用迭代器进行循环,但也使用擦除。擦除将使迭代器无效,循环不再起作用。 erase返回一个新的有效迭代器,所以最好使用
inizio = merge1.erase(inizio);