C++ 将两个std::pair(X,Y)视为与std::pair(Y,X)相同
这是我的密码C++ 将两个std::pair(X,Y)视为与std::pair(Y,X)相同,c++,C++,这是我的密码 typedef std::pair链接 std::map<link, double> container; std::map容器; 我试图做的是计算X到Y的距离,并将其作为container存储在容器中; 现在我必须计算从Y到X的距离,而不是重新进行整个计算,从容器中获取存储的值,即…,link和距离 我当前的实现仅适用于(X,Y) std::map::iterator It=container.begin(); std::对k=链路(X,Y); It=contai
typedef std::pair链接代码>
std::map<link, double> container;
std::map容器;
我试图做的是计算X到Y的距离,并将其作为container存储在容器中;
现在我必须计算从Y到X的距离,而不是重新进行整个计算,从容器中获取存储的值,即…,link和距离
我当前的实现仅适用于(X,Y)
std::map::iterator It=container.begin();
std::对k=链路(X,Y);
It=container.find(K);
如果(It!=container.end()){distance=It->second;}
else{/*distance=/*complexcalc*/container.insert(std::make_pair(k,distance));}
如何将其广义化,使链接(X,Y)和链接(Y,X)被视为相同的?始终保持X和Y的排序,即在插入、搜索、删除时,首先将对排序,然后将排序后的对与映射方法一起使用
或者,创建自己的链接
构造函数帮助器来强制执行该规则,并在构建它们的任何地方直接使用它,这样就不必进行不必要的转换
事实上,如果您已经定义了一个特定类型,那么很好的做法是同时创建类型构造函数和运算符,这样,如果该类型将来发生更改,您就不必通过所有代码来更正它。始终保持X和Y的排序,即在插入、搜索、删除时,首先对这对进行排序,然后将该排序对与map方法一起使用
或者,创建自己的链接
构造函数帮助器来强制执行该规则,并在构建它们的任何地方直接使用它,这样就不必进行不必要的转换
事实上,如果您已经定义了一个特定的类型,那么创建类型构造函数和运算符也是一种很好的做法,这样,如果该类型将来发生更改,您就不必通过所有代码来更正它。创建您的make\u pair函数。这样你就可以一直保持秩序
typedef std::pair<unsigned long, unsigned long> link;
link make_my_pair(unsigned long x, unsigned long y) {
if (x < y ) return std::make_pair(x, y);
return std::make_pair(y, x);
}
typedef std::pair链接;
链接使_成为我的_对(无符号长x,无符号长y){
如果(x
我找到了解决方案。实现您的“欠”配对功能。这样你就可以一直保持秩序
typedef std::pair<unsigned long, unsigned long> link;
link make_my_pair(unsigned long x, unsigned long y) {
if (x < y ) return std::make_pair(x, y);
return std::make_pair(y, x);
}
typedef std::pair链接;
链接使_成为我的_对(无符号长x,无符号长y){
如果(x
我找到了解决方案。为地图使用不同的键比较器,如下所示:
bool link_compare(link lhs, link rhs) // note: parameters taken by value
{
if (lhs.first > lhs.second) std::swap(lhs.first,lhs.second);
if (rhs.first > rhs.second) std::swap(rhs.first,rhs.second);
return lhs < rhs;
}
std::map<link, double, bool(*)(link,link)> container(link_compare);
bool-link\u-compare(link-lhs,link-rhs)//注意:参数按值取值
{
if(lhs.first>lhs.second)std::swap(lhs.first,lhs.second);
如果(rhs.first>rhs.second)std::swap(rhs.first,rhs.second);
返回左侧<右侧;
}
标准::映射容器(链接\u比较);
我认为,您应该考虑将<代码>链接< /COD>单独的类,具有特定于它的数据成员名,而不是泛型<代码>第一< /代码>和<代码>第二版/代码>。在我看来,code>std::pair
,是一种快速修复方法,可以在您必须将无关数据作为单个对象传递时包含这些数据。你所拥有的显然是非常相关的数据。仅仅因为std::pair
恰好能够保存正确的数据成员,并不意味着您应该使用它。为您的地图使用不同的密钥比较器,如下图所示:
bool link_compare(link lhs, link rhs) // note: parameters taken by value
{
if (lhs.first > lhs.second) std::swap(lhs.first,lhs.second);
if (rhs.first > rhs.second) std::swap(rhs.first,rhs.second);
return lhs < rhs;
}
std::map<link, double, bool(*)(link,link)> container(link_compare);
bool-link\u-compare(link-lhs,link-rhs)//注意:参数按值取值
{
if(lhs.first>lhs.second)std::swap(lhs.first,lhs.second);
如果(rhs.first>rhs.second)std::swap(rhs.first,rhs.second);
返回左侧<右侧;
}
标准::映射容器(链接\u比较);
我认为,您应该考虑将<代码>链接< /COD>单独的类,具有特定于它的数据成员名,而不是泛型<代码>第一< /代码>和<代码>第二版/代码>。在我看来,code>std::pair,是一种快速修复方法,可以在您必须将无关数据作为单个对象传递时包含这些数据。你所拥有的显然是非常相关的数据。仅仅因为
std::pair
恰好能够保存正确的数据成员,并不意味着您应该使用它。非常感谢!这很有帮助,我没有返回std::make_pair(x,y),而是返回了link(x,y)。非常感谢!这很有帮助,我没有返回std::make_pair(x,y),而是返回link(x,y)。