我想使用三元组类,尽可能与std :: pair类似。 STL似乎没有。我不想使用太重的东西,比如Boost。是否有一些有用的FOSS非限制性许可三联类可以从某个地方解除?我应该自己动手吗?我应该完全做些什么吗?
修改:关于std::tuple
...
特定于三胞胎的课程真的没有益处吗?我的意思是,有了元组,我无法做到
template<typename T1, typename T2, typename T3> std::tuple<T1, T2, T3> triple;
我现在可以吗?我不是必须键入dede个人类型组合三元组吗?
答案 0 :(得分:32)
不,不要自己动手。相反,请查看std::tuple
- 这是std::pair
的概括。所以这是int
s的值初始化三元组:
std::tuple<int, int, int> triple;
如果需要,您可以只为三元组设置类型别名:
template<typename T1, typename T2, typename T3>
using triple = std::tuple<T1, T2, T3>;
答案 1 :(得分:7)
如果可以使用C ++ 11,请使用std :: tuple
如果没有,请使用boost :: tuple
答案 2 :(得分:6)
如果您正在使用C ++ 11,则可以使用std::tuple
。
如果您正在使用C ++ 03,那么您需要使用自己的(不是太难)或使用Boost中的tuple
。
答案 3 :(得分:3)
我认为你需要这样的东西:
template<typename T>
struct triplet
{
T first, middle, last;
};
template<typename T>
triplet<T> make_triplet(const T &m1, const T &m2, const T &m3)
{
triplet<T> ans;
ans.first = m1;
ans.middle = m2;
ans.last = m3;
return ans;
}
用法示例:
triplet<double> aaa;
aaa = make_triplet<double>(1.,2.,3.);
cout << aaa.first << " " << aaa.middle << " " << aaa.last << endl;
triplet<bool> bbb = make_triplet<bool>(false,true,false);
cout << bbb.first << " " << bbb.middle << " " << bbb.last << endl;
我正在使用它,这对我的目的来说已经足够了......但是,如果你想要不同的类型,只需做一些修改:
template<typename T1, typename T2, typename T3>
struct triplet
{
T1 first;
T2 middle;
T3 last;
};
template<typename T1, typename T2, typename T3>
triplet<T1,T2,T3> make_triplet(const T1 &m1, const T2 &m2, const T3 &m3)
{
triplet<T1,T2,T3> ans;
ans.first = m1;
ans.middle = m2;
ans.last = m3;
return ans;
}
用法非常相似:
triplet<bool,string,myDouble> ccc;
ccc = make_triplet<bool,string,double>(false,"AB",3.1415);
ccc.middle = "PI";
cout << ccc.first << " " << ccc.middle << " " << ccc.last << endl;
答案 4 :(得分:-1)
要将相似性方面添加到std :: pair,您可以定义具有第一个,第二个和第三个的类。我的猜测是,在这种情况下,您无法避免创建std :: pair的子类并添加“第三个”成员。这是几行代码。
此外,如果您经常使用相同类型的这些东西,您也可以制作双胞胎和三胞胎类。使用C ++轻松制作 - 11'使用',如:
template <typename T> using twins = std::pair<T,T>;
答案 5 :(得分:-1)
一个简单但有时非常合适的替代方法是使用双对:
std::pair<std::pair<T1, T2>, T3>
如果三元组实际上由两个可以自然地被认为是成对的子元素组成,这尤其适合。
这是由 Paweł Stawarz 在 Does C++ provide a "triple" template, comparable to pair<T1, T2>? 和 Frédéric Hamidi 在对原始问题的评论中提出的建议。如果您觉得这有用,请为他们的答案点赞。