C++初始化固定宽度std::string数组中的每个字符
C++ Initialize Each Character in array of std::string of Fixed Width
有没有一种方法可以使用值初始化而不是 std::transform()
或循环分配来初始化 std::string
数组(普通旧数组或 std::array
)中每个字符串的每个字符文字或临时对象?以 20
std::string
个 20
个字符的数组为例,我们希望将每个字符初始化为 'x'
.
基本上,我想做的是将每个字符串初始化为 std::string(WIDTH, char)
。初始化第一个是直接的,例如
#define NSTR 20
#define NCHR 20
...
std::string strarr[NSTR] { std::string(NCHR,'x') };
但是在初始化列表中只为第一个字符串提供了一个初始化器,其余字符串由于提供的值少于所有提供的值而按预期初始化为空。通过值、直接、复制或列表 Initialization 似乎没有提供通过初始化的方法。 (我试图避免为数组中的每个字符串提供明确的文字或临时的,例如,如果 NSTR
是 1000
,那么它就会成为 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
所有的东西!)。
有没有一种方法可以使用值初始化而不是 std::transform()
或循环分配来初始化 std::string
数组(普通旧数组或 std::array
)中每个字符串的每个字符文字或临时对象?以 20
std::string
个 20
个字符的数组为例,我们希望将每个字符初始化为 'x'
.
基本上,我想做的是将每个字符串初始化为 std::string(WIDTH, char)
。初始化第一个是直接的,例如
#define NSTR 20
#define NCHR 20
...
std::string strarr[NSTR] { std::string(NCHR,'x') };
但是在初始化列表中只为第一个字符串提供了一个初始化器,其余字符串由于提供的值少于所有提供的值而按预期初始化为空。通过值、直接、复制或列表 Initialization 似乎没有提供通过初始化的方法。 (我试图避免为数组中的每个字符串提供明确的文字或临时的,例如,如果 NSTR
是 1000
,那么它就会成为 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
所有的东西!)。