ใน C ++ ตกลงเพื่อขโมยทรัพยากรจากแผนที่ที่ฉันไม่ต้องการอีกต่อไปหรือไม่? แม่นยำมากขึ้นถือว่าผมมีstd::mapกับstd::stringกุญแจและฉันต้องการที่จะสร้างเวกเตอร์ออกมาจากมันโดยการขโมยทรัพยากรของmapปุ่ม s std::moveใช้ โปรดทราบว่าการเข้าถึงเพื่อเขียนไปยังคีย์จะทำลายโครงสร้างข้อมูลภายใน (การเรียงลำดับคีย์) ของmapแต่ฉันจะไม่ใช้มันในภายหลัง
คำถาม : ฉันสามารถทำสิ่งนี้ได้โดยไม่มีปัญหาหรือสิ่งนี้จะนำไปสู่ข้อผิดพลาดที่ไม่คาดคิดเช่นในตัวทำลายของmapเพราะฉันเข้าถึงมันในแบบที่std::mapไม่ได้ตั้งใจหรือไม่?
นี่คือตัวอย่างโปรแกรม:
#include<map>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
int main(int argc, char *argv[])
{
    std::vector<std::pair<std::string,double>> v;
    { // new scope to make clear that m is not needed 
      // after the resources were stolen
        std::map<std::string,double> m;
        m["aLongString"]=1.0;
        m["anotherLongString"]=2.0;
        //
        // now steal resources
        for (auto &p : m) {
            // according to my IDE, p has type 
            // std::pair<const class std::__cxx11::basic_string<char>, double>&
            cout<<"key before stealing: "<<p.first<<endl;
            v.emplace_back(make_pair(std::move(const_cast<string&>(p.first)),p.second));
            cout<<"key after stealing: "<<p.first<<endl;
        }
    }
    // now use v
    return 0;
}
มันผลิตผลลัพธ์:
key before stealing: aLongString
key after stealing: 
key before stealing: anotherLongString
key after stealing: 
แก้ไข: ฉันต้องการทำสิ่งนี้กับเนื้อหาทั้งหมดของแผนที่ขนาดใหญ่และบันทึกการจัดสรรแบบไดนามิกโดยการขโมยทรัพยากรนี้
std::stringมีการเพิ่มประสิทธิภาพสั้น ๆ หมายความว่ามีตรรกะบางอย่างที่ไม่เกี่ยวกับการคัดลอกและการเคลื่อนย้ายและไม่ใช่แค่การแลกเปลี่ยนตัวชี้และนอกจากนี้เวลาส่วนใหญ่ยังหมายถึงการคัดลอก - เพื่อมิให้คุณจัดการกับสตริงที่ค่อนข้างยาว ความแตกต่างทางสถิติมีขนาดเล็กอย่างไรก็ตามโดยทั่วไปแล้วมันแตกต่างกันไปขึ้นอยู่กับชนิดของการประมวลผลสตริง
                
constค่าจะเป็นUB เสมอ