C ++에서는 나중에 더 이상 필요하지 않은 맵에서 리소스를 훔치는 것이 괜찮습니까? 더 정확하게 말하면 std::map
with 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입니다.