std::vector<std::pair<std::string > >
可用于存储一对字符串的列表。是否有类似的方法来存储字符串的三元组列表?
我能想到的一种方法是使用std::vector
std::vector<std::vector<std::string > > v (4, std::vector<std::string> (3));
但这不允许我使用谨慎的first
和second
访问者。
所以,我写了自己的班级
#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;
}
我有两个问题
答案 0 :(得分:9)
std::tuple
是std::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
)。尽管如此,我认为您可以从对代码的批评中学到一些东西:
std::pair
这样的东西,你为什么不写一些表现得像std::pair
的东西?也就是说,具有公共数据成员的类按值复制其项目?std::pair
这样的东西,为什么不像std::pair
那样使它更通用,其中不同的成员可以有不同的类型?或者,如果您只关心存储std::string
成员,为什么还要把它变成模板类?const
引用来获取其参数。triad.get1() = ...
,你将试图取消引用空指针崩溃!)您的构造函数应使用初始化列表初始化其数据成员。例如:
triad() : one(0), two(0), three(0) { }
使std::pair
比仅仅制作struct
所需成员更有用的一点是,operator==
和operator<
附带了1}。
const
个版本。答案 3 :(得分:1)
如果您的三元组是特定的,那么创建一个类,或至少一个结构,这样您就可以为成员提供有意义的名称。
struct Contact
{
std::string name;
std::string nickname;
std::string email;
};
std::vector<Contact> contacts;