带有参数的 func return list (int arry[int]<int>, int array[int])
func return list<int> with args (int arry[int], int array[int])
我的问题是:
我认为这个算法有效。。。但Visual Studio 2013给了我一个错误:
C2893未知类型std::less::operator()(_Ty1&&;,_Ty2&&;)常量。
我必须创建一个func,它接受两个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::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";
}
请注意:由于我们需要输入数据的副本,所以我首先通过值传递第一个参数,所以这是其中一个输入的副本。然后,我们将另一个输入的内容复制到它的末尾。然后我们有一个包含所有数据的单个向量,然后我们可以对其进行排序并删除重复数据。
这种复制最初可能看起来很浪费,但除非我们被允许修改其中一个输入,否则这是非常必要的。
是的,如果你真的关心节省空间,即使是以稍大的算法复杂性为代价,你当然可以首先排序,然后从每个输入中删除重复项,然后合并并再次删除重复项。如果你期望有很多重复,这可能会更快——但你需要对输入数据有相当多的了解,才能确定它更快(甚至"不慢")。
在这里编译得很好也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);
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 呼叫运营商<<临时
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- 运营商&lt;&lt;无法访问班级的私人int
- std::pair的默认构造函数<>将基本类型(int等)设置为零
- 如何显示/打印字符串对象?cout & lt; & lt;Int工作,count <<字符串