将大数据文件读入数据结构c ++

时间:2013-10-08 06:56:01

标签: c++ oop

为了给一点背景,我有三个主要类别Customer,Tours,Hires 客户将在其构造函数中拥有基本客户数据,例如客户名称,客户ID 作为GuidedTours基类的巡回赛有类似的数据 雇用是一个类,其中包含可由客户雇用的设备的详细信息

主要问题

我们需要从大文本文件中读取所有这些类的数据,并且基本上将它们存储在不同的数据结构Map,List,Vector中,以对所有这些数据结构进行性能限制检查。
所以我可以看到它的工作,但最令我困惑的部分是我如何初始化不同的对象

1如果我从main读取它,则将该行标记为如下 Tour *newtour = new Tour();
newTour.addtoMap(tokenise, data, will, go, here);

在这个方法中,我将在tour中添加名为“addtoMap”的函数并在其中实现我的数据结构,并且在main.cpp一侧,我将在向量中保存每个Tour指针。我是否必须在默认的Tour()构造函数中初始化数据结构 这是一个很好的编程习惯吗?我们需要在每个数据结构上做一段时间才能给出不同结构之间的图形表示和偏差,但是我将使用向量来存储我在main.cpp中的所有Tour,Customer,Hire指针,将有对性能有任何重大影响。

2如果我按以下方式进行 Tour *newtour = new Tour(tokenised, data, goes, here);
这样我将值传递给构造函数,所以我将不得不在该构造函数中执行我的Map实现,我觉得这样做不好。
有没有其他方式让我这样做,我喜欢这种方法,但我无法想象我将如何以及在哪里实现我的Map来存储这些数据?

我是c ++的新手,我想以这样的方式实现它,这样做的原因是支持OOP方法。如果有任何其他方式,我会对此持开放态度。

我看过另一个有类似问题的线程,但他有3.8gb的数据文件我的只有934 kb,但它对我来说足够大了。

3 个答案:

答案 0 :(得分:2)

如果您想从文本文件中读取这些类,我建议您为输入流和运算符提供构造函数,以便为每个类序列化数据。 c ++的方法通常是这样的:

class Tour {
public:
   Tour(std::istream & input);
   friend std::ostream & operator<<(sd::ostream & channel, Tour const & t);
   friend std::istream & operator>>(std::istream & channel, Tour & t);   
};

编辑:参数的顺序不正确,我改了。抱歉我的错误。

查看this tutorial以了解有关流的信息。运营商LT;&LT;必须能够将您的课程编写为std::stream。运营商GT;&GT;必须能够阅读它。如果默认构造一个类没有意义,那么流构造函数是个好主意,但至少要提供运算符&lt;&lt;和运算符&gt;&gt;。

一旦您可以阅读/编写课程,将它们放入mapvector就可以阅读文件并使用这些方法了。

答案 1 :(得分:1)

你需要在容器和数据对象之间分开 - 听起来你需要的是你的数据对象的“简单”数据持有者类,例如:一个Customer课程。而且,对于其中的每一个,您将需要一个容纳此类对象的容器。

您最好使用STL (standard template library) containers,例如vector(或map或您需要的任何内容),例如vector<Customer>。这些容器将为您管理清单做所有繁重的工作。您只需编写数据类,例如:

 class Customer
 {
 private:
     std::string m_name;
 public:
     Customer(std::string name): m_name(name) {}
 };

然后:

 std::string nameLoadedFromFile;
 Customer customer(nameLoadedFromFile);
 std::vector<Customer> custList.push_back(customer);

答案 2 :(得分:-1)

使用指针是糟糕的编程习惯。 Tours的矢量而不是Tour指针的矢量有什么问题?

对我来说,问题的答案是改变将游览添加到地图的方式。这看起来是最自然的做事方式

Tour newtour(tokenised, data, goes, here); // no pointers
map.addTour(newtour);

因此,将addTour作为地图对象的一种方法,而不是addtoMap作为Tour的方法。