双循环添加值

时间:2017-04-06 15:10:24

标签: c++ for-loop

我有2个向量,每个向量只有4个值。我想循环遍历它们并将它们一起处理,因为两个向量中的值一起在向量中的那些位置。

for (std::vector<boost::filesystem::path>::iterator i = volumeVec.begin(); i != volumeVec.end(); ++i) {         
        for (std::vector<boost::filesystem::path>::iterator j = sliceHeaderVec.begin(); j != sliceHeaderVec.end(); ++j) {
            ParseHeader(j->string(), i->string(), sourceDir);  
        }             
    }

但是,当我运行ParseHeader时,它会处理更多的值,然后是我所期待的。我想我需要修复for循环的安排,但不知道该怎么做

3 个答案:

答案 0 :(得分:2)

您可能需要以下内容:

assert(volumeVec.size() == sliceHeaderVec.size());
for (std::size_t i = 0; i != volumeVec.size(); ++i) {
    ParseHeader(volumeVec[i].string(), sliceHeaderVec[i].string(), sourceDir);
}

range-v3

for (const auto& p : ranges::view::zip(volumeVec, sliceHeaderVec)) {
    ParseHeader(std::get<0>(p).string(), std::get<1>(p).string(), sourceDir);
}

答案 1 :(得分:2)

如果我理解你,你会遇到这样的情况:

v1 = { v11, v12, v13, v14}

v2 = { v21, v22, v23, v24}

你想要一个循环来处理成对v1中来自v2{v11, v21}, {v12, v22}, {v13, v23}, {v14, v24}的元素。

在这种情况下,您只需使用索引循环:

for (size_t i = 0; i < v1.size(); ++i)
{
    process(v1[i], v2[i]);
}

在此之前,您可能需要检查v1.size() == v2.size()以避免出现问题。

答案 2 :(得分:0)

如果您有两个要运行操作(即转换)的集合,我的建议是使用std::transform中的<algorithm>。在我看来,用它编写的代码具有良好的可读性:

假设您有vector<int> v1vector<int> v2并希望添加它们,您可以这样做:

std::transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), std::plus<int>());

如果需要,最后一个参数也可以是其他迭代器或后插入器。

相关问题