В 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.