2012-05-04 32 views
12

私は2つのライブラリを扱っています。 1つは取り込み、std::stringを返し、もう1つはstd::vector<unsigned char>を返します。std :: std :: stringとstd :: vectorの間の移動<unsigned char>

std::stringstd::vector<unsigned char>から根本的な配列を盗んで、余分なコピーをせずにそれらを互いに移動させることができたらいいですね。

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

そして、他の方法:

はATM私はのようなものを使用

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

答えて

7

これはできません。

vectorstringクラスは、それぞれvectorまたはstringよりも何か他のものから盗むための方法を提供していません。彼らはコンテンツを交換するつもりはありません。

問題の問題は、vectorstringが、さまざまな根本的な表現を持つ可能性があるということです。典型的にはgccでは、stringは、典型的なvector表現(通常はポインタ/ size_t属性の3倍)とは大幅に異なる古いCOW(Copy On Write)「最適化」を使用します。

生のバイトを扱っている場合は、stringに配置することを決めたライブラリを責め、できればそれをリファクタリングします。

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

+1

C++ 11は明示的に書き込み時にコピーを許可しませんか?彼らが「スペック」の法律を遵守しているかのように行動する限り、それを維持しない限り。私は小さな文字列の最適化がしばらくの間行っている方法だと思います。 –

10

あなたをイテレータを使用して初期化を使用できます。ありがとうございますhere

EDIT:ideoneに行く必要がないようにコードを貼り付けます。あなたはコードでarroundを再生できるようにリンクを残しておきます。

#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; 
} 
+1

もちろん、これは必要なコピー(彼の質問についてのもの)に関しては、彼の解決策と何ら変わるものではないので、決して彼の質問に答えることはできません。しかし、彼のソリューションよりもはるかにクリーンですが、コメントはこれで十分でしょう。 –

+0

@Christianなぜ多くのクリーナー? 'template string&assign(InputIterator first、InputIterator last);文字列を代入するには、文字列を代入します(const char * s、size_t n)。 'それをエミュレートします – Liviu

関連する問題