跟踪“消费”的数据结构

时间:2011-01-12 13:48:07

标签: c++

大家,嘿 我正在为我的c ++类迷你项目编写一个小应用程序 它是关于管理电信公司的客户,线路和服务 我应该使用一个Consumption类,它应该代表服务/线路的每月消费。

class Consumption  
{  
private:  
     Ligne* m_line;//the line related to this consumption  
     Service* m_service;//service used by this line  
     int m_month;
  int m_year;  
  int m_units;//units of m_service used in the m_month of m_year  
public:  
     //some getters and setters  
     double price();//returns m_units * the service's price/unit
};

每行最多可以使用2个服务 消费将用于为某一行开出账单 我的问题是,跟踪创建的消费的最佳方法是什么?我的意思是什么数据结构可能是最好的使用?我应该对班级做出任何改变吗?
请注意,我没有使用文件存储任何内容 任何帮助表示赞赏...

2 个答案:

答案 0 :(得分:0)

以类似数组的方式存储内容并保持对任何元素的常量访问时间的最佳结构是向量。它就像你有动态大小的数组。

第二个选择是deque。如果您计划拥有非常多的数据,因为它有更好的存储管理,您可以从前面和后面编辑它,而不仅仅是向量中。

最后一个可能是列表。如果您计划对数据进行大幅度编辑,例如删除插入新元素(不仅仅是访问它们),您应该考虑这个,因为它在插入/删除元素时具有线性复杂性,而前2个具有线性加上额外的线性时间直到位置和结束之间的元素数量。

所以结论:

  • vector - 最简单
  • deque - 适合大数据存储
  • list - 适合存储的大编辑

这些是STL序列容器,包括标题应该如下所示:

#include <vector>

here's reference for all STL containers

编辑: 我知道你的意思是别的,但我把它留在这里并添加它。

你真的需要消费阶层吗?我的意思是,如果你在Line类中保留关于line的所有数据,那将更合乎逻辑。这意味着如果需要,我会将每月使用的服务存储在向量中,或者我会立即计算价格并记住上个月的服务。我还会创建一个名为program的类,它将存储所使用的服务并让它处理正在使用的服务数量。如果已经有2个,它可以丢弃新服务,或者重写旧服务。您还可以使程序返回价格并将其乘以使用的时间。像这样:

#include <vector>

using namespace std;

class Service{
public:
    int getPrice(){return monthPrice;}
    void setPrice(const int &p) { monthPrice = p; }
private:
    int monthPrice;
};

class Program{
public:
    Program(){servicesUsed = 0; monthTime = 0;}
    Program(const int &t) : monthTime(t) {servicesUsed = 0;}
    void setTime(int t){monthTime = t;}
    void addService(Service &s);
    int price(); //calculate price of program
private:
    int monthTime; //time that program was used
    Service services[2]; //services used in program
    int servicesUsed;
};

void Program::addService(Service &s){
    if(servicesUsed < 2){ // Discarding solution
        services[servicesUsed] = s;
        servicesUsed++;
    }
}

int Program::price(){
    int pP = 0;
    for(int i = 0; i < servicesUsed; i++){
        pP += services[i].getPrice();
    }
    pP *= monthTime;
    return pP;
}

class Line{
public:
    Program *addMonth(const int &t); //will return handle for month
    int consuption(); //calculate full line consuption
private:
    vector<Program> monthList; //store data about services per month
};

Program *Line::addMonth(const int &t){
    monthList.push_back(Program(t));
    return &monthList.back();
}

int Line::consuption(){
    int p = 0;
    for(unsigned int i = 0; i < monthList.size(); i++){
        p += monthList[i].price();
    }
    return p;
}

int main(){
    //showcase
    Program *handle;
    Service s1,s2,s3;
    s1.setPrice(50);
    s2.setPrice(75);
    s3.setPrice(100); //probably read from file
    Line line;
    handle = line.addMonth(30); // monthTime probably also from file
    handle->addService(s1);
    handle->addService(s2);
    handle->addService(s3);
    handle = line.addMonth(60); 
    handle->addService(s3);
    handle->addService(s2);
    int p = line.consuption();
    return 0;
}

应该工作正常,你可能需要修改它;)

答案 1 :(得分:0)

您使用不好的方法来解决问题。

你说:什么结构最好解决(你的问题)

首先,必须对要保存的数据进行建模以及如何组织数据,我建议使用数据库设计中常用的Entity Relationship Model

WHEN 您将图表返回到代码编辑器,以便在C ++中描述如何表示该模型。

然后,您将能够选择最适合您的数据结构。我建议看看STL,不是很漂亮,但效率很高,你不需要重新发明轮子:)