Trong C ++, có thể lấy cắp tài nguyên từ bản đồ mà tôi không cần sau đó nữa không? Chính xác hơn, giả sử tôi có một std::map
với std::string
phím và tôi muốn xây dựng một véc tơ ra khỏi nó bằng cách ăn cắp các nguồn lực của map
các phím s sử dụng std::move
. Lưu ý rằng việc truy cập ghi vào các khóa làm hỏng cơ sở hạ tầng bên trong (thứ tự các khóa) của map
nhưng tôi sẽ không sử dụng nó sau đó.
Câu hỏi : Tôi có thể làm điều này mà không có bất kỳ vấn đề nào không hoặc điều này sẽ dẫn đến các lỗi không mong muốn, ví dụ như trong hàm hủy của map
vì tôi đã truy cập nó theo cách std::map
không dành cho?
Đây là một chương trình ví dụ:
#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;
}
Nó tạo ra đầu ra:
key before stealing: aLongString
key after stealing:
key before stealing: anotherLongString
key after stealing:
EDIT: Tôi muốn làm điều này cho toàn bộ nội dung của một bản đồ lớn và lưu các phân bổ động bằng cách đánh cắp tài nguyên này.
std::string
có tối ưu hóa chuỗi ngắn. Có nghĩa là có một số logic không tầm thường khi sao chép và di chuyển và không chỉ trao đổi con trỏ và ngoài ra hầu hết thời gian di chuyển ngụ ý sao chép - e rằng bạn xử lý các chuỗi khá dài. Sự khác biệt thống kê là dù sao nhỏ và nói chung, nó chắc chắn thay đổi tùy thuộc vào loại xử lý chuỗi được thực hiện.
const
giá trị luôn luôn là UB.