12

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

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 是否提供类似的功能?其他人如何做到这一点?每次我在项目中需要它时都必须自己复制/粘贴这个功能似乎很愚蠢。

4

5 回答 5

6

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

于 2012-04-17T11:56:11.350 回答
5

简单地调用:

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

是将字符串转换为数组的方式。我看不出将其包装成专用的“实用程序”功能有什么好处。

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

于 2013-11-18T14:00:49.043 回答
1

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

于 2012-04-17T12:47:18.777 回答
1

没关系,也许在 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 是原始数组,此函数也将起作用。

于 2012-04-17T15:49:45.437 回答
0

它不适用于 std::string,但如果您使用 C 字符串文字 (char const *),C++20std::to_array仅针对此类事物引入:

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

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

于 2022-02-05T14:57:17.720 回答