2012-03-23 50 views
4
std::vector<std::pair<std::string > > 

可用于存储一对字符串的列表。有没有类似的方式来存储字符串的三元组列表?我能想到的如何存储三个字符串集合的列表?

一种方法是使用std::vector

std::vector<std::vector<std::string > > v (4, std::vector<std::string> (3)); 

但这不会让我使用handly firstsecond存取。

所以,我写我自己的类

#include <iostream> 
#include <vector> 
using namespace std; 

template <class T> 
class triad { 
private: 
    T* one; 
    T* two; 
    T* three; 
public: 
    triad() { one = two = three =0; } 
    triad(triad& t) { 
     one = new T(t.get1()); 
     two = new T(t.get2()); 
     three = new T(t.get3()); 
    } 
    ~triad() { 
     delete one; 
     delete two; 
     delete three; 
     one = 0; 
     two = 0; 
     three = 0; 
    } 
    T& get1() { return *one; } 
    T& get2() { return *two; } 
    T& get3() { return *three; } 
}; 

int main() { 
    std::vector< triad<std::string> > v; 
} 

我有两个问题

  1. 可以将我的类代码以任何方式加以改进?
  2. 有没有比上述三种方式更好地存储三串字符串的方法?

回答

9

std::tuplestd::pair的概括,它允许您存储指定大小的集合。所以,你可以说:

typedef std::tuple<std::string, std::string, std::string> Triad; 

得到一个类型Triad,它存储三个字符串。

+2

'std :: tuple'是C++ 11中的新增功能,但应该在大多数比几年前更新的编译器中可用。 – 2012-03-23 07:43:37

3

正如其他人所说,你应该使用std::tuple(或boost::tuple)。不过,我觉得有东西,你可以从你的代码的批评学:如果你想要像std::pair,你为什么不写的东西表现得像个std::pair

  1. ?也就是说,一个有公共数据成员的类按价值复制它的项目?
  2. 如果你想要类似std::pair的东西,为什么不使它更通用,如std::pair,其中不同的成员可以有不同的类型?或者,如果你只关心存储std::string成员,为什么要把它作为模板类呢?
  3. 您的副本构造函数应该采用const引用的参数。
  4. 您没有按照Rule of Three。你有一个不平凡的拷贝构造函数和一个非平凡的析构函数,但忽略实现一个拷贝赋值操作符。但是,如果你做了#1,你不需要担心这一点。
  5. 正如所写,不可能设置你的班级的数据成员。没有构造函数使用指定的值初始化它们,并且在构建之后无法设置它们。 (如果你尝试triad.get1() = ...,你会试图解引用空指针!)
  6. 你的构造函数应该使用初始化列表初始化它们的数据成员。例如:

    triad() : one(0), two(0), three(0) { }

  7. 之一,使得std::pair有用过简单地使所希望的部件的struct的事情之一是,它带有operator==operator<

  8. 如果您确实想使用存取方法,那么您应该提供const版本。
1

如果你的三元组是特定的,那么创建一个类或者至少一个结构体,这样你就可以给成员赋予有意义的名字。

struct Contact 
{ 
    std::string name; 
    std::string nickname; 
    std::string email; 
}; 

std::vector<Contact> contacts; 
相关问题