将 ( set<pair<x,y>> ) 重写为结构体

Rewriting ( set<pair<x,y>> ) as a struct

本文关键字:gt lt 结构体 重写 set pair      更新时间:2023-10-16

我必须写这个:

set<pair<float,int>>foo;
foo.insert(make_pair(a, b));
while (!foo.empty())
{
    float dist = foo.begin()->first;
    int u = foo.begin()->second;
}

但我想使用我自己的实现,而不添加集合/对的所有功能。

这基本上就是我想让这对搭档做的:

struct pair2
{
    float first;
    int second;
    pair2(float arg_first, int arg_second)
    {
        first = arg_first;
        second = arg_second;
    }
    pair2 make_pair2(float first2, int second2)
    {
        return (pair2(first2,second2));
    }
};

我不确定这是否完全正确,但我也必须实现set才能使用它:

set<pair>foo;   //not set<pair<float,int>>foo; since not templated
foo.insert(make_pair2(a,b));

最好的方法是什么?我应该使用向量实现集合吗?我只需要设置:empty()、begin()、erase()和insert(),这些向量已经有了。

如果我理解正确,您希望有一对"未模板"。您可以键入别名,可以使用别名将类型重命名为某个自定义类型。

您可以称之为my_pair,而不是每次都键入std::pair<float, int>

这就是你在C++11:中可以做到的方法

#include <iostream>
#include <utility>
#include <set>
using my_pair = std::pair<float, int>;
my_pair make_my_pair(float a, int b) {
  return std::make_pair(a, b);
}
int main() {
  my_pair a(1.5, 2);
  my_pair b = make_my_pair(2.2, 3);
  std::cout << a.first << " " << a.second << std::endl;
  std::cout << b.first << " " << b.second << std::endl;
  std::set<my_pair> foo;
  foo.insert(make_my_pair(3.4, 4));
  return 0;
}

请务必使用-std=c++11进行编译。


如果你不能/不想使用C++11构造,你也可以这样做:

#include <iostream>
#include <utility>
#include <set>
typedef std::pair<float, int> my_pair;
my_pair make_my_pair(float a, int b) {
  return std::make_pair(a, b);
}
int main() {
  my_pair a(1.5, 2);
  my_pair b = make_my_pair(2.2, 3);
  std::cout << a.first << " " << a.second << std::endl;
  std::cout << b.first << " " << b.second << std::endl;
  std::set<my_pair> foo;
  foo.insert(make_my_pair(3.4, 4));
  return 0;
}