双精度表示循环加值

Double for loop adding values

本文关键字:循环 表示 双精度      更新时间:2023-10-16

我有 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 循环的排列,但不知道该怎么办

您可能想要类似的东西:

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);
}

如果我理解正确,您会遇到这样的情况:

v1 = { v11, v12, v13, v14}

v2 = { v21, v22, v23, v24}

并且您需要一个循环,该循环成对处理来自v1v2的元素{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()以避免出现问题。

如果您想对其运行操作(也称为转换(的两个集合,我的建议是使用 <algorithm> 中的std::transform。在我看来,用它编写的代码是可读性的:

假设您有vector<int> v1vector<int> v2并想要添加它们,您可以执行以下操作:

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

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