我们可以在STL映射中使用用户定义的类作为键吗?

时间:2010-08-05 17:55:02

标签: c++ stl

我需要地图中的一个键,但是,我发现它应该是多个数据。我可以将这些数据放在一个用户定义的类中,并将整个类作为键放在地图中吗?

它会影响时间效率吗?

这里应该应用哪些其他问题?

6 个答案:

答案 0 :(得分:6)

任何类型都可以用作键,只要它是

  • 能够复制
  • 可分配
  • 可比较,因为地图按键排序

如果你的课只是一个简单的结构,那么它已经可以复制和分配了。要使类具有可比性,您必须实现operator<,或者使用自定义比较函数创建地图以供使用。

对时间效率的唯一影响来自较大的对象需要更长的时间来复制和比较。如果对象需要那么大,那么你无能为力,所以不用担心。

答案 1 :(得分:2)

只要该类具有operator<(或以其他方式使其实例< - 具有可比性,例如通过定义一个可以接受两个这样的实例作为参数的独立operator<方式或另一种 - 或者,再次,您使用显式比较对象制作地图),它将正常工作。当且仅当该运算符或函数(以及其复制构造函数等其他关键位)当然是快速的。

编辑:添加了额外的位operator<(如果你想要使用它而不是提供显式的比较对象)不需要是运算符,但可以是一个单独的函数 - tx到@Neil在评论中指出这一点。

答案 2 :(得分:2)

要用作地图键类型的类型需要具有std::less<T>特化或传递给地图的另一个谓词(而不是默认的std::less)。 std::less的默认实施使用<。所以你可以

    您的类型
  1. 重载operator<()
  2. 为其专门std::less
  3. 将不同的谓词传递给std::map

答案 3 :(得分:1)

是的,您可以使用任何类作为键,只要它实现了less-than运算符&lt;或者你在地图定义中给出一个比较特征。

除非在实践中证明是一个问题,否则不要担心时间。

答案 4 :(得分:1)

关于使用用户定义的键的键,当然。由于Map的定义方式,您必须为您的类定义'小于'运算符(运算符&lt;),或在构造映射时给出比较器对象。 Here是后者的一个例子。

关于效率,不要过早担心,但一个问题是制作关键对象副本的成本是多少。

这不是关于效率,而是避免以影响运算符&lt;的结果的方式改变密钥的内容。当他们在地图上时。

如果您对使用密钥的不同组件进行有效索引感兴趣(因为您说它是'多个数据',请查看boost::multi_index

答案 5 :(得分:0)

肯定你可以,你只需要超载&#34;&lt;&#34;运算符以设置用户定义的键。一个例子:

        <?php
    $date = "";
    $begin = "";
    $tijdsduur = "";
    $aantal = "";
    if (isset($_POST['date']) && isset($_POST['quantity'])) {
      if (isset($_POST['date'])) {
            print_r($_POST);
            // echo "Yes, mail is set";
            $date = $_POST['date'];
            $begin = $_POST['begin'];
            $tijdsduur = $_POST['eind'];
            $aantal = $_POST['quantity'];
            $eind = $begin + $tijdsduur;
            $startTijd = "$date " . $begin;
            $eindTijd = "$date " . $eind . ":00";
            // echo $date . "<br>";
            // echo "$startTijd". "<br>";
            // echo "$eindTijd". "<br>";
            // echo $aantal. "<br>";
            $canmakereservation = "https://www.planyo.com/rest/?method=can_make_reservation&api_key=YOURKEY&resource_id=110556&start_time=$startTijd&end_time=$eindTijd&quantity=$aantal";
                    $cleancanmakereservation = preg_replace("/ /", "%20", $canmakereservation);
                    $reservationavailable = file_get_contents("$cleancanmakereservation");
                    $reservationAvailable = json_decode($reservationavailable, true);
                    // echo "$cleancanmakereservation";
                    echo json_encode($reservationAvailable);
        }
        else {
            echo "No, mail is not set";
      }
      exit;
    }
    ?>