假设我有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。
答案 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次