我有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循环的安排,但不知道该怎么做
答案 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> v1
和vector<int> v2
并希望添加它们,您可以这样做:
std::transform(v1.begin(), v1.end(), v2.begin(), v1.begin(), std::plus<int>());
如果需要,最后一个参数也可以是其他迭代器或后插入器。