访问向量<vector <double>&gt;并计算值</vector <double>

时间:2014-05-24 08:19:01

标签: c++ math vector

假设我有vector<vector<double>>,其中包含以下值列表:

  

第1项:A1 B1 C1 D1 ...
  第2项:A2 B2 C2 D2 ...
  第3项:A3 B3 C3 D3 ...

项目1..3属于第一个向量,值A..D属于第一个向量内的第二个向量。
我只需要计算从A1到A3的值并生成并显示结果。对于B,C和D也是如此。现在我只能使用迭代器访问和显示vector<vector<double>>内的值。
但是,如何仅通过访问彼此对应的值来进行计算?有什么建议吗?

修改
vector<vector<double>>包含这些值(例如):
v[0]={1,2,3,4,5},v[1]={2,3,4,5,6},v[2]={3,4,5,6,7}
这些矢量值是动态存储的,矢量可以包含更多的值,如上例所示 我需要将每个向量的每个值相加并显示结果。例如,计算在一起的每个向量的第一个元素将给出值6。

3 个答案:

答案 0 :(得分:1)

让我们命名你的矢量v(外部矢量,像矢量这样的矢量) v [0]将访问您的第一个向量,根据您的解释判断,是A1-> A3。您总是可以使用v [x] x = index访问矢量元素,对于矢量矢量,将它们视为2D数组,使用v [x] [y],其中x = 1-3和y = AD,或其他我的解释是错误的。

答案 1 :(得分:0)

我不完全确定我的意图是否正确,但我相信你想要的是boost::zip_iterator

Here's a live example on Coliru。请注意,它使用C ++ 14自动扣除返回类型。它也会编译为带有警告的C ++ 11(除非您添加了尾随返回类型,当然,但我很懒)。

#include <iostream>
#include <vector>

#include <boost/range/iterator_range.hpp>
#include <boost/iterator/zip_iterator.hpp>

template<typename... T>
auto zip(T&... containers) {
    return boost::make_iterator_range(
        boost::make_zip_iterator(boost::make_tuple(std::begin(containers)...)),
        boost::make_zip_iterator(boost::make_tuple(std::end(containers)...))
    );
}

int main() {
    // Say we want to compute the sum, column per column, of these 3 vectors
    std::vector<std::vector<double>> v = {
        { 0.1, 1.1, 2.1, 3.1 },
        { 0.2, 1.2, 2.2, 3.2 },
        { 0.3, 1.3, 2.3, 3.3 }
    };

    // Magic
    for (auto t : zip(v[0], v[1], v[2])) {
        std::cout << t.get<0>() + t.get<1>() + t.get<2>() << std::endl;
    }

    return 0;
}

输出:

0.6
3.6
6.6
9.6

答案 2 :(得分:0)

正如我在评论中看到的那样,我认为你应该使用std :: map而不是std :: vector,因为你想通过一个值(A,B,C或C)来访问内部向量的元素anythink)而不是索引(1,2,3,...)。所以std :: vector&gt;应该更合适。

#include <iostream>
#include <map>
#include <vector>

int main()
{
   std::vector<std::map<std::string, double>> v;
   std::map<std::string, double> m1, m2, m3;

   m1["A"]=0.0;
   m1["B"]=1.0;
   m1["C"]=2.0;

   m2["A"]=0.0;
   m2["B"]=1.0;
   m2["C"]=2.0;

   m3["A"]=0.0;
   m3["B"]=1.0;
   m3["C"]=2.0;

   v.push_back(m1);
   v.push_back(m2);
   v.push_back(m3);

   for(auto& m : v) {
       std::cout << m["A"] << std::endl;
   }
}

在上面的示例中,我打印了所有&#34; A&#34;向量的元素。在此示例中,它将打印0.0 3次