C++初始化固定宽度std::string数组中的每个字符

C++ Initialize Each Character in array of std::string of Fixed Width

有没有一种方法可以使用值初始化而不是 std::transform() 或循环分配来初始化 std::string 数组(普通旧数组或 std::array)中每个字符串的每个字符文字或临时对象?以 20 std::string20 个字符的数组为例,我们希望将每个字符初始化为 'x'.

基本上,我想做的是将每个字符串初始化为 std::string(WIDTH, char)。初始化第一个是直接的,例如

#define NSTR  20
#define NCHR  20
...
std::string strarr[NSTR] { std::string(NCHR,'x') };

但是在初始化列表中只为第一个字符串提供了一个初始化器,其余字符串由于提供的值少于所有提供的值而按预期初始化为空。通过值、直接、复制或列表 Initialization 似乎没有提供通过初始化的方法。 (我试图避免为数组中的每个字符串提供明确的文字或临时的,例如,如果 NSTR1000,那么它就会成为 space 问题,NCHR 1000)

对象是created/constructed之后,然后循环并分配临时(或文字)或std::transform (or std::fill)提供一种简单的方法,例如

    std::string strarr[NSTR] {};
    
    for (auto& s : strarr) {
        s = std::string(NCHR,'x');
    }

    std::transform (strarr, strarr + NSTR, strarr, 
                    [](std::string s) { return s = std::string(NCHR,'x'); } );

或最短的,使用std::fill_n和一个临时字符串对象:

    std::fill_n (strarr, NSTR, std::string (NCHR,'x'));

std::string 使用容器似乎不会公开任何额外的单次初始化,这些初始化也会初始化所有字符串,例如

    std::array<std::string,NSTR> strarr{};

是否有一些直接的方法来初始化 std::string 数组中的每个字符,或者是在定义数组之后设置它们?如果是(或不是),为什么?

(我怀疑是后者,因为 strarr 在评估初始化程序时不是一个完整的实例,排除了使用该实例的迭代器。但是,在阅读了最新的草案之后[dcl.dcl] 对于 C++20 标准,我找不到说 can't 的部分或说 can -- 或者我只是对白话不够熟悉,无法识别相关部分...)

使用立即调用的初始化 lambda:

#include <array>
#include <string>

constexpr std::size_t NSTR{20u};
constexpr std::size_t NCHR{20u};

int main() {


    const auto strarr = []() {
        std::array<std::string, NSTR> strings{};
        for(auto& s : strings) {
            s = std::string(NCHR, 'x');
        }
        return strings;
    }(); //Immediately Invoked Initializing Lambda

    return 0;
}

IIIL 通常用于变量的初始化,否则将是一个复杂的过程。这也使得变量现在可以被声明为 const,而之前由于 post-声明初始化通过循环(const 所有的东西!)。