我的主要功能:
#include <vector>
//#include <algorithm>
#include <iostream>
int main()
{
std::vector<char> v;
int len = 2 * 5 + 1;
v.reserve(len);
// using for loop and push_back
for (int i = 0; i < len; i++)
(i % 2) ? v.push_back(' ') : v.push_back('|');
// using generate
// std::generate(v.begin(), v.end(), [n = 0]() mutable { return (n++ % 2) ? ' ' : '|'; });
// std::generate_n(v.begin(), len, [n = 0]() mutable { return (n++ % 2) ? ' ' : '|'; });
for (const char& c : v)
std::cout << c;
return 0;
}
使用for循环和push_back我得到输出:
| | | | | |
使用 std::generate 没有效果,使用 std::generate_n 会导致断言失败:
表达式:结束后无法查找向量迭代器
据我了解,调用 .reserve 不会改变迭代器开始和结束之间的“距离”,因此我无法将它们传递给 std::generate 以放置 ' ' 和 '|'在我为 v 保留的内存中。我必须将 v.end 增加 len (len+1?),这可能吗?或者是否有另一种方法可以完成这项工作,而不使用 .push_back 或类似的操作,或者不使用某些东西初始化保留内存然后覆盖它?也不确定 lambda 是否正确,但这并不重要。
您可以将
std::generate_n
与容器上的 std::back_inserter
一起使用。
这将在生成容器时调整其大小。
预留是可选的,但它可能会节省容器大小调整和重新分配。