为什么 std::生成类似于 std::for_each 的返回状态?
Why doesn't std::generate return state similar to std::for_each?
std::generate
返回void
:
template<typename ForwardIterator, typename Generator>
void generate(ForwardIterator first, ForwardIterator last, Generator gen);
而std::for_each
返回Function
:
template<typename InputIterator, typename Function>
Function for_each(InputIterator first, InputIterator last, Function f);
SGI的文档表明,for_each
的结果对于返回任何可能在算法过程中发生突变的状态是有用的。generate
不也是这样吗?这是一种疏忽,还是存在接口差异的基本原理?
一个显著的区别是,for_each
对容器内容进行操作,而generate
只是覆盖它。因此,传递给generate
的函数对象不能收集有关容器内容的信息,因此没有理由在之后返回它(它的最终状态是容器内容的不变量)。
我怀疑这是为了允许谓词在generate
的工作中被复制,因此维护内部状态并不总是正确的。for_each
实际上只改变谓词的一个实例,然后返回它的一个副本。
通常是让谓词存储对外部状态对象的引用,然后在生成完成时检查。
StateHolder state;
Generator generator(state); // Pass by reference.
std::generate(c.begin(), c.end(), generator);
// Now you can check the state object for whatever you need.
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 如何获取std::result_of函数的返回类型
- 架构决策:返回std::future还是提供回调
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 使用std::mt19937从字符串中返回一个随机单词
- 如何使用std::min和std::less返回对象
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 返回一个带有 std::move 的对象并链接函数
- 推导 std::vector::back() 的返回类型
- 为什么 C++ std::unordered_map 从 emplace/ 找到返回一个迭代器?
- 如何从 std::thread 返回值
- 从 std<Derived>::shared_ptr 的向量返回 std::shared_ptr<Base>
- 在带有尾部斜杠的路径上返回 std::filesystem::create_directories() 的值
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何从 std::vector 搜索和返回项目
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 使用 std::p air 进行返回值优化
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?