如何存储三个字符串集的列表?

时间:2012-03-23 07:34:28

标签: c++

std::vector<std::pair<std::string > >

可用于存储一对字符串的列表。是否有类似的方法来存储字符串的三元组列表?

我能想到的一种方法是使用std::vector

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

但这不允许我使用谨慎的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. 有没有比上述三种方式更好的方法来存储字符串三元组?

4 个答案:

答案 0 :(得分:9)

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

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

获取存储三个字符串的类型Triad

答案 1 :(得分:5)

您可以使用来自boost:http://www.boost.org/doc/libs/1_49_0/libs/tuple/doc/tuple_users_guide.html

的元组

(在C ++中,11个元组是标准库的一部分:http://en.wikipedia.org/wiki/C%2B%2B11#Tuple_types

答案 2 :(得分:3)

正如其他人所提到的,您应该使用std::tuple(或boost::tuple)。尽管如此,我认为您可以从对代码的批评中学到一些东西:

  1. 如果你想要std::pair这样的东西,你为什么不写一些表现得像std::pair的东西?也就是说,具有公共数据成员的类按值复制其项目?
  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个版本。

答案 3 :(得分:1)

如果您的三元组是特定的,那么创建一个类,或至少一个结构,这样您就可以为成员提供有意义的名称。

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

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