Чи добре в C ++ вкрасти ресурси з карти, яка мені вже не потрібна? Точніше, припустимо , що у мене є std::map
з std::string
ключами , і я хочу , щоб побудувати вектор з нього шляхом крадіжки ресурсів map
и ключів з використанням 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:
EDIT: Я хотів би зробити це для всього вмісту великої карти та зберегти динамічні асигнування шляхом крадіжки ресурсів.
std::string
оптимізації коротких струн. Це означає, що існує певна нетривіальна логіка копіювання та переміщення, а не просто обмін вказівниками, а крім того, більшість часу переміщення передбачає копіювання - щоб не мати справу з досить довгими рядками. Різниця в статистиці в будь-якому випадку була невеликою, і загалом вона, безумовно, змінюється в залежності від того, який тип обробки рядків виконується.
const
значення завжди є UB.