【问题标题】:std::move between std::string and std::vector<unsigned char>std:: 在 std::string 和 std::vector<unsigned char> 之间移动
【发布时间】:2012-05-13 18:35:22
【问题描述】:

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

如果我能从std::stringstd::vector&lt;unsigned char&gt; 窃取底层数组并能够将它们相互移动而无需过度复制,那就太好了。

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

【问题讨论】:

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


    【解决方案1】:

    这是不可能的。

    vectorstring 类不提供窃取 vectorstring 以外的任何东西的方法分别。它们不是用来交换内容的。

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

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

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

    【讨论】:

    • C++11 明确禁止写入时复制,不是吗?除非他们遵守“只要它表现得好像我们遵守规范”的法律。我认为小字符串优化已经有一段时间了。
    【解决方案2】:

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

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

    【讨论】:

    • 当然,这与他的解决方案没有什么不同,关于必要的副本(他的问题是关于什么的),因此不会以任何方式回答他的问题。不过,这比他的解决方案要干净得多,但是对此发表评论就足够了。
    • @Christian 为什么更干净? string&amp; assign (const char* s, size_t n); 应该做一个 memcpy,而 template &lt;class InputIterator&gt; string&amp; assign (InputIterator first, InputIterator last); 模拟它
    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2011-10-26
    • 1970-01-01
    相关资源
    最近更新 更多