类似STL对的三胞胎类 - 我自己动手吗?

时间:2013-12-20 14:23:36

标签: c++ c++-standard-library stdtuple triplet

我想使用三元组类,尽可能与std :: pair类似。 STL似乎没有。我不想使用太重的东西,比如Boost。是否有一些有用的FOSS非限制性许可三联类可以从某个地方解除?我应该自己动手吗?我应该完全做些什么吗?

修改:关于std::tuple ...

特定于三胞胎的课程真的没有益处吗?我的意思是,有了元组,我无法做到

template<typename T1, typename T2, typename T3> std::tuple<T1, T2, T3> triple;
我现在可以吗?我不是必须键入dede个人类型组合三元组吗?

6 个答案:

答案 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ł StawarzDoes C++ provide a "triple" template, comparable to pair<T1, T2>?Frédéric Hamidi 在对原始问题的评论中提出的建议。如果您觉得这有用,请为他们的答案点赞。