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());

文字列を配列に変換する方法です。これを専用の「ユーティリティ」関数にラップする利点はありません。

さらに、コンパイラが最適化しない限り、関数のパフォーマンスが低下する可能性があります。データは、配列を返すときに 2 回目にコピーされます。

于 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++20 ではstd::to_array次のような機能が導入されています。

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

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

于 2022-02-05T14:57:17.720 に答える