Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL结对式三胞胎类-我自己滚吗?_C++_C++ Standard Library_Stdtuple_Triplet - Fatal编程技术网

C++ STL结对式三胞胎类-我自己滚吗?

C++ STL结对式三胞胎类-我自己滚吗?,c++,c++-standard-library,stdtuple,triplet,C++,C++ Standard Library,Stdtuple,Triplet,我想使用一个三元组类,尽可能类似于std::pair。STL似乎没有。我不想用太重的东西,比如Boost。是否有一些有用的FOSS非限制性许可证三元组类我可以从某处提升?我应该自己滚吗?我应该完全做些别的事情吗 编辑:关于std::tuple 三元组特定的类真的没有好处吗?我是说,对于tuple,我做不到 template<typename T1, typename T2, typename T3> std::tuple<T1, T2, T3> triple; 模板st

我想使用一个三元组类,尽可能类似于std::pair。STL似乎没有。我不想用太重的东西,比如Boost。是否有一些有用的FOSS非限制性许可证三元组类我可以从某处提升?我应该自己滚吗?我应该完全做些别的事情吗

编辑:关于
std::tuple

三元组特定的类真的没有好处吗?我是说,对于tuple,我做不到

template<typename T1, typename T2, typename T3> std::tuple<T1, T2, T3> triple;
模板std::元组三元组;

现在我可以吗?难道我不需要输入单独的类型组合三元组吗?

不,不要自己输入。相反,请看一看-它是
std::pair
的泛化。这里有一个初始化为
int
s的值:

std::tuple<int, int, int> triple;
std::元组三元组;
如果需要,可以仅为三元组使用类型别名:

template<typename T1, typename T2, typename T3>
using triple = std::tuple<T1, T2, T3>;
模板
使用triple=std::tuple;

如果可以使用C++11,请使用std::tuple


如果没有,请使用boost::tuple

如果您使用的是C++11,则可以使用


如果您使用的是C++03,那么您要么需要使用自己的滚动(这并不难),要么使用Boost的
tuple

我认为您需要这样的东西:

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;
}
模板
结构三联体
{
T第一、中间、最后;
};
模板
三线制三线制(常数T&m1、常数T&m2、常数T&m3)
{
三重态ans;
ans.first=m1;
ans.middle=m2;
ans.last=m3;
返回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;
triplet-aaa;
aaa=形成三重态(1,2,3.);

cout若要将相似性方面添加到std::pair,可以定义一个具有第一、第二和第三属性的类。我的猜测是,在这种情况下,您无法避免创建std::pair的子类并添加“第三个”成员。这是几行代码

此外,如果您经常将这些东西与同一类型一起使用,您还可以创建twins和triplet类。使用C++-11的“使用”功能轻松制作,例如:

template <typename T> using twins = std::pair<T,T>;
模板使用twins=std::pair;

一种简单且有时非常合适的替代方法是使用双绞线:

std::pair
如果三元组实际上由两个子元素组成,并且可以自然地认为是成对的,那么这一点尤其适合


这是in和by在对原始问题的评论中提出的。如果您觉得这很有用,请向上投票。

我会说
std::tuple
。如果出于某种原因,您无法访问
std::tuple
(例如,不符合C++11的编译器),考虑<代码> STD::配对< /代码> .@ Fr.EdEdRigaMIDI:这会使元素引用变得相当繁琐和不必要。但是元素引用与<>代码STD::配对< /代码>已经不直观了。你真的希望元素被称为
first
second
(而不是像
key
value
,或者
name
姓氏
)的频率有多高。@JamesKanze:
mytriple.second.second
mytriple.third>更容易混淆。哦,不,三元组类绝对不应该是
std::pair
的子类。三联体不是一种配对,就像
std::pair
不是
T
U
的子类一样。我不明白你的意思。一对双胞胎是一对,其中Tand U是同一等级,triplet有3个相同类型。任何三胞胎都可以用在任何双胞胎都可以用的地方。这绝对不是真的。对于一对,您依赖于正好有两条数据;对于三元组,你做出了一个矛盾的假设。它们不仅不能是子类,而且不能互换使用。对不起,我不同意。在任何需要双胞胎的地方,你都可以使用三胞胎,但反过来不行。这正是继承的理念,LSK的应用非常完美。此外,由于成员被称为“第一”和“第二”参数化函数和类,因此即使它们实际上在三元组上操作,它们也能从一对函数和类中获得所需的内容。非常标准,非常好。代码中有一个小错误。
make\u triplet
的定义应为
triplet make\u triplet(常数T1和m1、常数T2和m2、常数T3和m3)
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;
template <typename T> using twins = std::pair<T,T>;