C++ 在c+中实现容器+;

C++ 在c+中实现容器+;,c++,containers,C++,Containers,我想实现一个容器,其中包含最多20个解决方案。 如果容器包含20种溶液,则添加的任何溶液只有在其 1) 新的_值。考虑使用 STD::复制< /代码>,或 STD::CopyOnn。 也可以考虑使用 STD::vector < /代码>赋值,然后可以去掉赋值-大小< /代码>。< /P> < P> OK,谢谢。 我希望这是正确的。它试图通过insert对列表进行排序,以便更容易检查,然后您可以删除最后一个元素 struct Solution { double power_peak; in

我想实现一个容器,其中包含最多20个解决方案。 如果容器包含20种溶液,则添加的任何溶液只有在其

1) 新的_值<容器中的最差值

2) 如果容器中已存在新的_值(且1已保存),则memcmp(新_分配、分配、分配_大小)!=0

然后删除最差的解决方案。(包括int数组) 所有解决方案的赋值大小相同

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
函数知道它的大小。