【问题标题】:Assigning a vector of one type to a vector of another type将一种类型的向量分配给另一种类型的向量
【发布时间】:2011-02-07 17:20:31
【问题描述】:

我有一个“事件”课程。由于处理日期的方式,我们需要将这个类包装在一个“UIEvent”类中,该类保存事件,以及另一种格式的事件日期。

允许从 Event 转换到 UIEvent 并返回的最佳方法是什么?我认为重载 UIEvent 的赋值或复制构造函数以接受事件(反之亦然)可能是最好的。

【问题讨论】:

    标签: c++ operator-overloading assignment-operator


    【解决方案1】:

    如果您可以将Event 转换为UIEvent(例如,如果UIEvent 有一个以Event 作为参数的构造函数),那么以下会将一个向量分配给另一个向量:

    uievent_vector.reserve(event_vector.size());
    uievent_vector.assign(event_vector.begin(), event_vector.end());
    

    如果转换有效,当然反过来也可以。

    您也可以使用std::copy() 来获得相同的效果。如果你不能在类接口中以一种方式进行转换,那么编写一个进行转换的函数,然后使用std::transform()

    struct to_uievent {
        UIEvent operator()(const Event& e) {
            // ...
        }
    };
    
    // ...
        std::transform(event_vector.begin(), event_vector.end(),
                       back_inserter(uievent_vector),
                       to_uievent());
    

    当然,您可以在上述函数对象中添加任意数量的 operator()() 重载,以便您可以将同一函数对象用于其他转换。

    【讨论】:

      【解决方案2】:

      我能想到两个简单的选项。

      第一个选项是你描述的那个:创建一个构造函数,它接受另一个类型的对象:

      struct UIEvent
      {
          UIEvent(const Event&);
      };
      

      并使用std::copy 将元素从一种类型的向量复制到另一种类型的向量:

      std::vector<Event> eventVector;
      std::vector<UIEvent> uiEventVector;
      
      std::copy(eventVector.begin(), eventVector.end(), 
                std::back_inserter(uiEventVector));
      

      第二种选择是编写一个非成员转换函数:

      UIEvent EventToUIEvent(const Event&);
      

      并使用std::transform:

      std::transform(eventVector.begin(), eventVector.end(), 
                     std::back_inserter(uiEventVector), &EventToUIEvent);
      

      这样做的好处是类之间的直接耦合较少。另一方面,有时类无论如何都是自然耦合的,在这种情况下,第一个选项可能同样有意义并且可能不那么麻烦。

      【讨论】:

      • 糟糕,我应该在回答 :p +1 的耦合点之前刷新我的页面。
      猜你喜欢
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 2018-01-15
      • 2021-12-18
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      相关资源
      最近更新 更多