标准::字符串到标准::数组

Std::string to std::array?

本文关键字:标准 数组 字符串      更新时间:2023-10-16

将字符串转换为数组的推荐方法是什么?我正在寻找类似的东西:

template<class T, size_t N, class V>
std::array<T, N> to_array(const V& v)
{
    assert(v.size() == N);
    std::array<T, N> d;
    std::copy(v.begin(), v.end(), d.data());
    return d;
}

C++11 或 Boost 是否提供这样的东西?其他人是怎么做到的?每次我在项目中需要它时都必须自己复制/粘贴这个函数似乎很愚蠢。

这似乎很好。C++11 中没有这样的东西,我认为 Boost 中也没有这样的东西。如果您不想将其粘贴到处都是,则可以将其放在标题中并#include

只需调用:

std::copy(v.begin(), v.end(), d.data());

是将字符串转换为数组的方法。我认为将其包装到专用的"实用程序"函数中没有任何优势。

此外,除非编译器对其进行优化,否则函数的性能可能会下降:返回数组时,数据将被第二次复制。

如果你真的只想将字符串转换为数组,只需使用.c_str()(并处理char*)。它并不完全array<>,但可能适合您的需求。

没关系,也许在 C++11 中稍作修改。

template<class T, size_t N, class V>
std::array<T, N> to_array(const V& v)
{
    assert(v.size() == N);
    std::array<T, N> d;
    using std::begin; using std::end; 
    std::copy( begin(v), end(v), begin(d) ); // this is the recommended way
    return d;
}

这样,如果删除断言,即使 v 是原始数组,此函数也将起作用。

它不适用于 std::string,但如果您使用的是 C 字符串文字(char const *),C++20 为这种事情引入了std::to_array

std::array arr {"Hello, world!"};

https://en.cppreference.com/w/cpp/container/array/to_array