std ::在std :: string和std :: vector <unsigned char =“”> </unsigned>之间移动

时间:2012-05-04 08:07:46

标签: c++ string vector std unsigned-char

我正在使用2个库。一个接受并返回std::string,而另一个使用std::vector<unsigned char> s。

如果我可以从std::stringstd::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&&);

2 个答案:

答案 0 :(得分:11)

您可以使用迭代器进行初始化。看看here

编辑:粘贴代码,这样您就不必去了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;
}

答案 1 :(得分:8)

这是不可能的。

vectorstring课程不提供从vectorstring 分别以外的任何其他内容窃取的方法。它们并不意味着交换内容。

问题在于vectorstring可能有很多不同的基础表示。通常在gcc中,string使用旧的COW(Copy On Write)“优化”,这与典型的vector表示(通常只是指针/ size_t属性的三倍)有很大不同。 / p>

如果您正在处理原始字节,请责备决定将它们放入string的库,并在可能的情况下重构它。

否则:复制。 reinterpret_cast不一定是必要的,因为charunsigned char之间存在隐式广告(现在char默认为unsigned)。