18

私は2つのライブラリで作業しています。1 つは s を受け取って返し、もう 1 つはstd::strings を使用しstd::vector<unsigned char>ます。

基になる配列を盗んで、過剰なコピーを行わずに相互に移動できるとstd::stringよいでしょう。std::vector<unsigned char>

ATM 私は次のようなものを使用します。

const unsigned char* raw_memory =
    reinterpret_cast<const unsigned char*>(string_value.c_str()),
std::vector<unsigned char>(raw_memory, raw_memory + string_value.size();

そして他の方法:

std::string(
    reinterpret_cast<const char*>(&vector_value[0]),
    vector_value.size());

以下を定義できる方がはるかに良いでしょう:

std::string move_into(std::vector<unsigned char>&&);
std::vector<unsigned char> move_into(std::string&&);
4

2 に答える 2

13

イテレータを使用して初期化を使用できます。こちらをご覧ください

編集: ideone に移動する必要がないようにコードを貼り付けます。コードをいじって遊ぶことができるように、まだリンクを残しています

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
        string a = "Hello world";
        vector<unsigned char> v(a.begin(), a.end());
        for (int i= 0 ;i<  v.size(); ++i) {
           cout << v[i] << endl;
        }
        string s(v.begin(), v.end());
        cout << s << endl;
        return 0;
}
于 2012-05-04T08:14:12.150 に答える
11

これは不可能です。

vectorおよびクラスは、またはそれぞれstring以外のものから盗む方法を提供しません。コンテンツを交換するためのものではありません。vectorstring

問題は、vector根本string的な表現が大きく異なる可能性があることです。たとえばgccでは通常string、古いCOW(Copy On Write)「最適化」を使用します。これは、典型的なvector表現(通常はポインター/ size_t属性のトリプル)とは大きく異なります。

生のバイトを扱っている場合は、それらを に入れることを決定したライブラリを非難し、string可能であればそれをリファクタリングします。

それ以外の場合: コピーします。との間に暗黙的なキャストがあるため、はreinterpret_cast必要ありません(現在は多くの場合デフォルトになっています)。charunsigned charcharunsigned

于 2012-05-04T08:27:13.717 に答える