gpt4 book ai didi

c++ - std::generate_n 的仿函数捕获和操作它用于填充的容器是否安全?

转载 作者:行者123 更新时间:2023-11-27 22:35:59 25 4
gpt4 key购买 nike

最近我一直在使用 STL 算法和 lambda 来实现重要的功能。几个星期前,有人告诉我,谓词(例如 std::count_if 中使用的 lambda)修改传递给它的值是非法的。

我只是接受了这一点,并记得永远不要尝试做那样的事情。但是,我刚刚遇到了一个可能类似的情况,我不确定使用这样的代码是否合法:

auto generate_n_fib(const std::size_t count = 2) {
assert(count != 0);
if(count == 1) {
return std::vector<std::size_t>{0};
}
if(count == 2) {
return std::vector<std::size_t>{0, 1};
}
std::vector<std::size_t> fib{};
fib.emplace_back(0);
fib.emplace_back(1);

if(count > 2) {
std::generate_n(std::back_inserter(fib), count - 2, [&fib](){
const auto last = fib.size() - 1;
return fib[last] + fib[last - 1];
});
}

return fib;
}

如您所见,上面的函数根据斐波那契数列生成第一个 count 数。相关部分是 std::generate_n 调用。

我的问题是 - 生成器函数访问由使用该生成器函数的算法修改的集合的字段是否安全?

最佳答案

std::generate_n 的一种可能实现方式是:

template< class OutputIt, class Size, class Generator >
OutputIt generate_n( OutputIt first, Size count, Generator g )
{
for( Size i = 0; i < count; i++ ) {
*first++ = g();
}
return first;
}

for 循环 中的表达式 *first++ 等价于在原始 vector fib 中调用 push_back >。如果您用它所做的替换该表达式,for 循环 几乎等同于:

for( Size i = 0; i < count; i++ ) {
fib.push_back(g());
}

作为 g 命名的 lambda:

auto g = [&fib]() {
const auto last = fib.size() - 1;
return fib[last] + fib[last - 1];
};

而且定义明确。

我们仍然可以展开操作;摆脱 lambda、后插入器迭代器并在 for 循环 中完成所有工作,同时拥有定义明确的代码。

关于c++ - std::generate_n 的仿函数捕获和操作它用于填充的容器是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54083821/

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