gpt4 book ai didi

c++ - 具有多个容器的循环范围

转载 作者:IT老高 更新时间:2023-10-28 22:39:24 36 4
gpt4 key购买 nike

假设我有 2 个(或更多)要同时迭代的容器 - 例如,计算两个 vector 的点积:

std::vector<double> vector1;
std::vector<double> vector2; // identical size to vector1

在两个(或所有)容器上同时指定 range-for 循环的首选 C++11 方法是什么?是否涉及在 range-for 循环中选择一个容器/迭代器来编写速记(即 for (auto i : c)),而所有其他容器/迭代器都必须进行长期处理?是否有任何理由将来无法扩展语法以支持两个/所有容器的简写,如下所示......这看起来真的很可读:

double dotProduct( 0.0 );
for ( auto const & value1 : vector1, auto const & value2 : vector2 ) // illegal!
{
dotProduct += value1*value2;
}

最佳答案

在其他(通常是函数式)语言中,这是通过使用名为 zip 的函数来完成的。例如,Python 有一个内置的 zip,它遍历其参数并返回一个元组:

for i in zip( [1,2,3], (1,2,3), { 0:0, 1:1, 2:2 } ): 
l,t,d = i
print("list item: %d, tuple item %d, dict item %d" % (l,t,d) )

您可以使用 C++ 中的范围库来获得该功能,例如Boost.RangeEric Niebler's rangev3 .不幸的是,范围没有在 C++17 标准中投票,但我永远不会在没有范围库的情况下开始一个项目。在 Boost.Range 中,该函数称为 combine:

#include <boost/range/combine.hpp>
#include <boost/tuple/tuple.hpp>
#include <iostream>
#include <vector>
#include <list>

int main(int, const char*[])
{
using namespace boost;

std::vector<int> const v{0,1,2,3,4};
std::list<char> const l{'a', 'b', 'c', 'd', 'e'};

for(auto const& i: combine(v, l))
{
int ti;
char tc;
boost::tie(ti,tc) = i;
std::cout << '(' << ti << ',' << tc << ')' << '\n';
}

return 0;
}

在 C++17 中,您可以将 std::tie 替换为结构化绑定(bind),并使用 std::tie 移除那种不寻常的“初始化”。

  for(auto const& [ti,tc] : boost::combine(v, l)) {
std::cout << '(' << ti << ',' << tv << ')' << '\n';
}

虽然我很遗憾 C++17 中没有包含范围,但我认为结构化绑定(bind)是一个巨大的进步,并将严重改变代码的编写方式。在标准中包含范围将使它们更受欢迎,并将它们从许多人反对的第三方库提升为 C++ 程序员应该知道的标准特性。

关于c++ - 具有多个容器的循环范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38493591/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com