C++ 在c+中实现容器+;
我想实现一个容器,其中包含最多20个解决方案。 如果容器包含20种溶液,则添加的任何溶液只有在其 1) 新的_值<容器中的最差值 2) 如果容器中已存在新的_值(且1已保存),则memcmp(新_分配、分配、分配_大小)!=0 然后删除最差的解决方案。(包括int数组) 所有解决方案的赋值大小相同C++ 在c+中实现容器+;,c++,containers,C++,Containers,我想实现一个容器,其中包含最多20个解决方案。 如果容器包含20种溶液,则添加的任何溶液只有在其 1) 新的_值。考虑使用 STD::复制< /代码>,或 STD::CopyOnn。 也可以考虑使用 STD::vector < /代码>赋值,然后可以去掉赋值-大小< /代码>。< /P> < P> OK,谢谢。 我希望这是正确的。它试图通过insert对列表进行排序,以便更容易检查,然后您可以删除最后一个元素 struct Solution { double power_peak; in
struct Solution {
double value;
int *assignment;
int assigment_size;
};
实现此结构的最简单方法是什么?您可以使用STL的一些容器吗?注意:我假设您的解决方案由您发布的
解决方案结构描述
最简单的解决方案是一个std::array
,用自定义容器包装器包装
你应该有这样的东西:
class SolutionsSequence
{
public:
// in a function to add a solution to the sequence, you should
// implement the criteria to decide which solution is worse
private:
std::array<Solution, 20> solutions_;
};
类解决方案序列
{
公众:
//在向序列添加解决方案的函数中,应
//实施标准以决定哪种解决方案更差
私人:
阵列解决方案;
};
<>除此之外,C++中不应使用<代码> MeMCPY < /C>。考虑使用<代码> STD::复制< /代码>,或<代码> STD::CopyOnn。
也可以考虑使用<代码> STD::vector < /代码>赋值,然后可以去掉<代码>赋值-大小< /代码>。< /P> < P> OK,谢谢。
我希望这是正确的。它试图通过insert对列表进行排序,以便更容易检查,然后您可以删除最后一个元素
struct Solution {
double power_peak;
int *assignment;
int size;
~Solution() { delete[] assignment; }
};
class Container {
list<Solution> Solutions;
uint max_size;
double worst_solution;
public:
Container (uint size)
{
max_size = size;
}
void addSolution(Solution s)
{
list<Solution>::iterator insert_position = Solutions.begin();
while (insert_position != Solutions.end() && (*insert_position).power_peak < s.power_peak)
{
if ((*insert_position).power_peak == s.power_peak && memcmp((*insert_position).assignment, s.assignment, s.size) == 0)
{
return;
}
++insert_position;
}
Solutions.insert(insert_position, s);
if (Solutions.size() > max_size)
{
Solutions.pop_back();
}
worst_solution = (*(--(Solutions.end())))->power_peak;
}
double getWorst()
{
return worst_solution;
}
};
struct解决方案{
双峰功率;
int*赋值;
整数大小;
~Solution(){delete[]赋值;}
};
类容器{
列出解决方案;
uint最大尺寸;
双最坏解;
公众:
容器(单位尺寸)
{
最大尺寸=尺寸;
}
无效添加解决方案(解决方案s)
{
列表::迭代器insert_position=Solutions.begin();
while(insert_position!=Solutions.end()&(*insert_position).power_peak最大大小)
{
解决方案;
}
最差解=(*(-(Solutions.end()))->功率峰值;
}
双倍
{
返回最差解;
}
};
您可以使用std::list作为容器。这是你的锻炼,不是我们的!你可以检查一下std::vector
提供了什么…@double\g为什么std::list
?起初我还以为std::vector
,但后来我想到std::map
可能更适合这个boost::flat_map
如果您想要性能。我建议使用std::list,但可以使用任何已排序的容器。我选择了一个列表来保存插入/弹出元素的逻辑。我不建议使用array
,因为array
在任何时候都是为20而设计的,而他要求最多20,这是一件非常不同的事情。你要么胡思乱想,要么有内幕信息,我说不出你还能解释些什么?@user3680510你的代码有未定义的行为。您的解决方案
对象无法安全复制,因为缺少用户定义的复制构造函数和赋值运算符(请阅读“规则3”)。如果您停止使用指针,并在解决方案
对象中使用std::vector
,那么这些问题就会消失。@user3680510-如果我列出一个列表并添加解决方案(解决方案*s),这也会起作用吗?
您为什么要寻找解决方案的问题?只需使用std::vector assignment
而不是int*assignment
,所有这些问题就会消失。使更多的代码使用指针使代码更脆弱。struct Solution{std::vector assignment;double power_peak;}代码>是您所需要的全部。这不仅消除了不可安全复制的问题,还不需要size
成员,因为向量通过调用vector::size
函数知道它的大小。