这是我第一次使用这个网站,很抱歉有任何错误的格式或奇怪的公式,我会尽力遵守这个网站上的规则,但我一开始可能会犯一些错误。
我现在正在使用 STL 容器在 C++ 中实现一些不同的 bin 打包算法。在当前代码中,我仍然有一些需要修复的逻辑错误,但这个问题更多的是关于程序的结构。对于如何构建程序以尽量减少逻辑错误的数量并使其尽可能易于阅读,我不希望有第二意见。在目前的状态下,我只是觉得这不是最好的方法,但我现在真的没有看到任何其他方法来编写我的代码。
该问题是一个动态在线装箱问题。从某种意义上说,它是动态的,即物品在离开分配给它们的箱之前有任意时间。
简而言之,我的问题是:
Bin 打包算法的结构在 C++ 中的外观如何?
STL 容器是使实现能够处理任意长度输入的好工具吗?
我应该如何以一种好的、易于阅读和实施的方式处理容器?
关于我自己的代码的一些想法:
使用类在处理不同箱的列表和这些箱中的项目列表之间做出很好的区分。
使实施尽可能有效。
易于运行许多不同的数据长度和用于基准测试的文件。
#include <iostream>
#include <fstream>
#include <list>
#include <queue>
#include <string>
#include <vector>
using namespace std;
struct type_item {
int size;
int life;
bool operator < (const type_item& input)
{
return size < input.size;
}
};
class Class_bin {
double load;
list<type_item> contents;
list<type_item>::iterator i;
public:
Class_bin ();
bool operator < (Class_bin);
bool full (type_item);
void push_bin (type_item);
double check_load ();
void check_dead ();
void print_bin ();
};
Class_bin::Class_bin () {
load=0.0;
}
bool Class_bin::operator < (Class_bin input){
return load < input.load;
}
bool Class_bin::full (type_item input) {
if (load+(1.0/(double) input.size)>1) {
return false;
}
else {
return true;
}
}
void Class_bin::push_bin (type_item input) {
int sum=0;
contents.push_back(input);
for (i=contents.begin(); i!=contents.end(); ++i) {
sum+=i->size;
}
load+=1.0/(double) sum;
}
double Class_bin::check_load () {
return load;
}
void Class_bin::check_dead () {
for (i=contents.begin(); i!=contents.end(); ++i) {
i->life--;
if (i->life==0) {
contents.erase(i);
}
}
}
void Class_bin::print_bin () {
for (i=contents.begin (); i!=contents.end (); ++i) {
cout << i->size << " ";
}
}
class Class_list_of_bins {
list<Class_bin> list_of_bins;
list<Class_bin>::iterator i;
public:
void push_list (type_item);
void sort_list ();
void check_dead ();
void print_list ();
private:
Class_bin new_bin (type_item);
bool comparator (type_item, type_item);
};
Class_bin Class_list_of_bins::new_bin (type_item input) {
Class_bin temp;
temp.push_bin (input);
return temp;
}
void Class_list_of_bins::push_list (type_item input) {
if (list_of_bins.empty ()) {
list_of_bins.push_front (new_bin(input));
return;
}
for (i=list_of_bins.begin (); i!=list_of_bins.end (); ++i) {
if (!i->full (input)) {
i->push_bin (input);
return;
}
}
list_of_bins.push_front (new_bin(input));
}
void Class_list_of_bins::sort_list () {
list_of_bins.sort();
}
void Class_list_of_bins::check_dead () {
for (i=list_of_bins.begin (); i !=list_of_bins.end (); ++i) {
i->check_dead ();
}
}
void Class_list_of_bins::print_list () {
for (i=list_of_bins.begin (); i!=list_of_bins.end (); ++i) {
i->print_bin ();
cout << "\n";
}
}
int main () {
int i, number_of_items;
type_item buffer;
Class_list_of_bins bins;
queue<type_item> input;
string filename;
fstream file;
cout << "Input file name: ";
cin >> filename;
cout << endl;
file.open (filename.c_str(), ios::in);
file >> number_of_items;
for (i=0; i<number_of_items; ++i) {
file >> buffer.size;
file >> buffer.life;
input.push (buffer);
}
file.close ();
while (!input.empty ()) {
buffer=input.front ();
input.pop ();
bins.push_list (buffer);
}
bins.print_list ();
return 0;
}
请注意,这只是我的代码的快照,尚未正常运行
不想用无关的喋喋不休把这个弄得乱七八糟,只想感谢做出贡献的人,我会检查我的代码,希望能够更好地构建我的程序