【问题标题】:How to calculate the sum of a vector without using loop or std::accumulate()?如何在不使用循环或 std::accumulate() 的情况下计算向量的总和?
【发布时间】:2012-11-03 02:47:49
【问题描述】:

我正在尝试为我的编程任务实现一个欧几里得向量。我需要重载 operator* 来为具有任意相同维度的两个向量提供点积计算。 以 3D 向量为例:

矢量 v1, v2; //两个 3D 向量。

双点积 = v1 * v2;

dotProduct的值应该是v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2]

所以,我的问题是如何在 numeric.h 头文件中不使用任何显式循环和 std::accumulate() 操作来获取此值?因为这些在本次作业中是被禁止的。

附:我可以将仿函数(自定义)与 STL 算法一起使用。

【问题讨论】:

  • 1) 你知道操作数总是三维的吗? 2) 什么是Vector
  • 正如您所写的dotProduct = v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2],在我看来,您已经知道如何解决这个问题。你尝试过什么,你到底卡在哪里?
  • 没有<numeric.h>,只有<numeric>Your answer is on this page。 (提示:点积是什么的一种类型?)
  • 您尝试计算的内容通常称为内积。用这种想法搜索现有算法可能会很有成效。
  • std::for_each 在不允许使用内置循环时可能会很好地发挥作用。

标签: c++ vector std


【解决方案1】:

如果您真的想避免一般的显式循环和算法(不仅仅是std::accumulate),您可以改用std::valarrays:

std::valarray<double> a;
std::valarray<double> b;

// code to put data in a and b goes here

double dotProduct = (a * b).sum();

我在这里使用double 作为类型,但您(当然)可以使用对您正在处理的数据/情况有意义的任何类型。

【讨论】:

    【解决方案2】:

    你可以使用std::inner_product,见http://en.cppreference.com/w/cpp/algorithm/inner_product

    double dotProduct = std::inner_product(v1.begin(), v1.end(), v2.begin());
    

    【讨论】:

      【解决方案3】:

      如果你不能使用显式循环,也许你的老师要求你使用递归。

      template<int N>
      int VectorSum(const Vector<N>& v1, const Vector<N>& v2, int m) {
        if(m) return v1[m]*v2[m] + VectorSum(v1, v2, m-1);
        return v1[0]*v2[0];
      }
      
      template<int N>
      int operator+(const Vector<N>& v1, const Vector<N>& v2) {
        return VectorSum(v1, v2, N-1);
      }
      

      【讨论】:

        【解决方案4】:

        我碰巧读了一篇关于它的文章,所以我复制给你。可能是在书中介绍的:C++ 模板:完整指南。

        #include <iostream>
        
        template<int DIM,typename T>
        struct DotProduct {
            static T execute(const T v1[],const T v2[]);
        };
        template<int DIM,typename T>
        T DotProduct<DIM,T>::execute(const T v1[],const T v2[]) {
            return v1[0]*v2[0] + DotProduct<DIM-1,T>::execute(v1+1,v2+1);
        };
        
        template<typename T>
        struct DotProduct<1,T> {
            static T execute(const T v1[],const T v2[]);
        };
        
        template<typename T>
        T DotProduct<1,T>::execute(const T v1[],const T v2[]) {
            return v1[0]*v2[0];
        };
        
        int main()
        {
            int v1[] = {1,2,3}; 
            int v2[] = {4,5,6};
            int r2 = DotProduct<3,int>::execute(v1,v2);
            std::cout << r2 << std::endl;
            return 0;
        }
        

        【讨论】:

        • 一个使用模板和递归的好例子!非常感谢!
        猜你喜欢
        • 1970-01-01
        • 2020-11-03
        • 1970-01-01
        • 2017-05-16
        • 1970-01-01
        • 2020-02-29
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多