是否可以在我们只调用了.reserve的空std::向量上使用std::generate?

问题描述 投票:0回答:1

我的主要功能:


#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 是否正确,但这并不重要。

c++ std
1个回答
0
投票

您可以将

std::generate_n
与容器上的
std::back_inserter
一起使用。

这将在生成容器时调整其大小。

预留是可选的,但它可能会节省容器大小调整和重新分配。

© www.soinside.com 2019 - 2024. All rights reserved.