gpt4 book ai didi

c++ - 如何使用 std::for_each 或 std::transform 编写此 for 循环?

转载 作者:搜寻专家 更新时间:2023-10-31 00:21:19 25 4
gpt4 key购买 nike

这更像是一个学习问题。有没有一种方法可以使用 std::for_each 或 std::transform 编写以下 for 循环?如果没有,boost 中有什么可以帮助解决这个问题吗?循环只是将 vector 的 vector 展平为一个长 vector 。

vector<vector<int> > int_vectors;

// ... fill int_vectors

vector<int> ints;

for (vector<vector<int> >::const_iterator iter = int_vectors.begin(); iter != int_vectors.end(); ++iter) {
ints.insert(ints.end(), iter->begin(), iter->end());
}

最佳答案

除非您有支持 lambda 的编译器,否则我不会更改它以使用其中一种算法。写的很清楚。即使您的编译器确实支持 lambda,我也可能不会更改此代码。

一个相对简单的选择是编写一个展平迭代器。我在 an answer to another question 中写了一个用于演示.

如果您真的想要一个单行代码并且可以使用bind(来自Boost 的boost::bindstd::来自 TR1 的 tr1::bind 和来自 C++0x 的 std::bind 都可以工作),那么这就是它的样子。我提前警告你:这太可怕了。

编辑:从技术上讲,这也是非法的。标准库成员函数的类型未指定,因此您不能(可移植地或正确地)获取此类成员函数的地址。如果您可以正确地获取标准库成员函数的地址,这就是它的样子:

typedef std::vector<int>::iterator (std::vector<int>::*IteratorGetter)();

std::for_each(int_vectors.begin(), int_vectors.end(),
std::bind(
std::bind(
&std::vector<int>::insert<std::vector<int>::iterator>,
&ints,
std::bind((IteratorGetter)&std::vector<int>::end, &ints),
_1,
_2
),
std::bind((IteratorGetter)&std::vector<int>::begin, _1),
std::bind((IteratorGetter)&std::vector<int>::end, _1)
)
);

(是的,从技术上讲,这是一个“代码行”,因为它是一条语句。我提取的唯一东西是用于消除重载 begin 的指针成员函数类型的 typedef end 函数;您不一定必须对此进行 typedef,但如果我不这样做,代码需要在 Stack Overflow 上水平滚动。)

关于c++ - 如何使用 std::for_each 或 std::transform 编写此 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4755288/

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