সি ++ এ, কোনও মানচিত্র থেকে আমার পরে আর প্রয়োজন হয় না এমন সংস্থানগুলি চুরি করা কি ঠিক হবে? আরও সুনির্দিষ্টভাবে, ধরুন আমার কীগুলির 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:
সম্পাদনা: আমি একটি বড় মানচিত্রের সম্পূর্ণ সামগ্রীর জন্য এটি করতে চাই এবং এই উত্স চুরির মাধ্যমে গতিশীল বরাদ্দ সংরক্ষণ করতে চাই।
std::string
স্বল্প-স্ট্রিং অপ্টিমাইজেশন রয়েছে। এর অর্থ যে অনুলিপি করা এবং চালনা করার বিষয়ে কিছু অ-তুচ্ছ যুক্তি রয়েছে এবং কেবল পয়েন্টার এক্সচেঞ্জই নয় এবং বেশিরভাগ সময় মুভিং করাকে বোঝানো হয় - যাতে আপনি দীর্ঘ স্ট্রিংয়ের সাথে ডিল করেন না। পরিসংখ্যানগত পার্থক্য যাই হোক না কেন ছোট ছিল এবং সাধারণত এটি স্ট্রিং প্রসেসিংয়ের ধরণের উপর নির্ভর করে অবশ্যই তা পরিবর্তিত হয় surely
const
মান পরিবর্তন করা সর্বদা ইউবি হয়।