【问题标题】:Any easy way to implement arithmetic operations for std::array and std::vector?为 std::array 和 std::vector 实现算术运算的任何简单方法?
【发布时间】:2014-03-30 04:32:50
【问题描述】:

对于std::arraystd::vector,有什么简单的方法可以重载各种算术运算符(+-*/+=、...)?算术运算是按成员计算的。类似于以下内容

template<class ContainerT, class opT>
ContainerT operator opT(ContainerT const& a, ContainerT const& b)
{
    ....
}

template<class ContainerT, class opT>
ContainerT operator opT=(ContainerT const& a, ContainerT const& b)
{
    ....
}

【问题讨论】:

  • 好吧,我现在可以告诉你,你至少得让它们全部超载一次。不过,每个运算符只需要一个重载就应该可以实现。
  • 容器应该是数字吗? 1xN 或 Nx1 矩阵?无论如何,除非您使用别人的代码,否则它不会比编写 代码 更容易。
  • 不清楚你想做什么,你想要一个地图,一个折叠......就地评估一个函数...... C++给你很多绳子......数组加一个int的意思是作为一个元素添加还是每个元素都添加?
  • 这就是std::valarray 的用途。
  • 您不能将运算符设为模板参数,但您可以使用“预处理器”宏将每个运算符设为单行。对于宏的所有弊端,如果您使用 #ifdef X / #error Macro X already defined / ... / #undef X 的形式,那将非常安全。

标签: c++ arrays vector containers


【解决方案1】:
std::vector<int> input1(..);
std::vector<int> input2(..);
std::vector<int> output(input1.size());
std::transform (input1.begin(), input1.end(), input2.begin(), output.begin(), std::plus<int>());

还有其他函子可供选择,您可以随时制作自己的函子或使用 lambda。

【讨论】:

    【解决方案2】:

    你想要这个吗?

    #include <iostream>    // std::cout
    #include <iterator>    // std::ostream_iterator, std::back_inserter
    #include <algorithm>   // std::copy, std::transform
    #include <vector>
    #include <deque>
    #include <list>
    
    int main()
    {
        std::vector<int> vt = { 1, 2, 3, 4, 5 };
        std::deque<int> de = { 3, 4, 5, 6, 7 };
        std::list<int> out;
    
        std::transform(vt.begin(), vt.end(), de.begin(), std::back_inserter(out),
            [](int a, int b) { return a + b; });
    
        std::copy(out.begin(), out.end(), std::ostream_iterator<int>(std::cout, "\n"));
    }
    

    输出是:

    4
    6
    8
    10
    12
    

    我认为运算符重载到 STL 容器,例如 std::vector 并不好。相反,您可以使用std::valarray

    【讨论】:

    • 这和std::transform有什么不同?
    • @NeilKirk std::transform 的输入迭代器范围是一个,但我的 do_operation 可以执行两个范围。
    • std::transform也可以,超载了。
    • valarrays 现在有点可疑;请看stackoverflow.com/questions/1602451/c-valarray-vs-vector
    猜你喜欢
    • 2017-05-31
    • 2019-12-06
    • 1970-01-01
    • 2018-12-16
    • 2013-01-29
    • 2013-09-27
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    相关资源
    最近更新 更多