18

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

如果我可以从中窃取底层数组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

这是不可能的。

vectorstring类不提供从其他任何东西窃取的方法,而vector不是string 分别。它们不是为了交换内容。

问题在于,vector并且string可能具有广泛不同的基础表示。例如,通常在 gcc 中,使用老式的 COW(写入时复制)“优化”,这与典型的表示(通常只是指针/size_t 属性的三元组)string大不相同。vector

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

否则:复制。reinterpret_cast不应该是必要的,因为它们char之间unsigned char有隐式转换(现在char通常unsigned是默认的)。

于 2012-05-04T08:27:13.717 回答