Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++ 将两个std::pair(X,Y)视为与std::pair(Y,X)相同_C++ - Fatal编程技术网

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)。