সংক্ষিপ্ত (স্পষ্টত) প্রথমে সি স্টাইলের স্ট্রিং তৈরির পরে স্টডি :: স্ট্রিং তৈরি করতে এটি ব্যবহার করে, চরগুলির ভেক্টর থেকে স্ট্রিং আরম্ভ করার জন্য কি আরও দ্রুত / বিকল্প / "আরও ভাল" উপায় আছে?
সংক্ষিপ্ত (স্পষ্টত) প্রথমে সি স্টাইলের স্ট্রিং তৈরির পরে স্টডি :: স্ট্রিং তৈরি করতে এটি ব্যবহার করে, চরগুলির ভেক্টর থেকে স্ট্রিং আরম্ভ করার জন্য কি আরও দ্রুত / বিকল্প / "আরও ভাল" উপায় আছে?
উত্তর:
আমি মনে করি আপনি ঠিক করতে পারেন
std::string s( MyVector.begin(), MyVector.end() );
যেখানে মাইভেক্টরটি আপনার স্ট্যান্ড :: ভেক্টর।
_ITERATOR_DEBUG_LEVEL=1( তবে এই ক্ষেত্রে এটি সূক্ষ্ম কাজ করে বলে মনে হচ্ছে)।
সি ++ 11 দিয়ে আপনি করতে পারেন std::string(v.data())বা, যদি আপনার ভেক্টরটির '\0'শেষে একটি থাকে না std::string(v.data(), v.size()),।
string(&v[0], v.size())এছাড়াও কাজ করা উচিত, তবে কেবল তখনই assert(not v.empty());, যেহেতু যদি ভেক্টরটি খালি থাকে, v[0]এবং উভয়ই v.front()অপরিজ্ঞাত আচরণের জন্য প্রার্থনা করবে। এটি, অ্যাড্রেস-অফ অপারেটরটি ব্যবহার না করার সিনট্যাকটিক সরলতা বাদে সি ++ 11 এর data()ফাংশনটির আসল উপকারিতা , যা খালি ভেক্টর এমনকি এমনকি কাজ করে।
std::string(v.data())দীর্ঘ স্ট্রিংয়ের নেতৃত্ব দিতে পারে। সুতরাং এইভাবে ব্যবহার করবেন না।
std::string(v.data(), v.size()), যা সঠিক কারণে উত্তরে উল্লেখ করা হয়েছিল?
std::string s(v.begin(), v.end());
যেখানে ভি বেশ কয়েকবার পুনরাবৃত্তিযোগ্য। (সুনির্দিষ্টভাবে শুরু () এবং শেষ () অবশ্যই ইনপুটআইটিরেটরে ফিরতে হবে))
কেবল সম্পূর্ণতার জন্য, অন্য একটি উপায় হ'ল std::string(&v[0])(যদিও আপনার স্ট্রিংটি নাল-টার্মিনেটেড রয়েছে এবং std::string(v.data())এটি সাধারণত পছন্দ করা উচিত তা নিশ্চিত করা দরকার ।
পার্থক্যটি হ'ল আপনি প্রাক্তন কৌশলটি ভেক্টরকে ফাংশনগুলিতে পাস করার জন্য ব্যবহার করতে পারেন যা বাফারটি সংশোধন করতে চায়, যা আপনি .ডাটা () দিয়ে করতে পারবেন না।
data()বাফারটি সংশোধন করতে কেন ব্যবহার করতে পারবেন না ? আমার কাছে দেখে মনে হচ্ছে আপনি যদি data()কোন কনস্ট্যান্ট ভেক্টরকে কল করেন তবে এটি একটি ফিরে আসবে T *(এবং যদি আপনার ভেক্টর কনস্ট হয় তবে 'v [0] any T const &যাইহোক ফেরত আসতে পারে )।
vস্ট্রিং থাকে তবে লক্ষ্য ধরণটি একটি স্ট্রিং এবং vএকটি ভেক্টর। (তবে এটি দেখতে খুব ভাল লাগল যে সি ++ 17 ভেক্টরটির সাথে স্ট্রিংসকে সমতা দেবে))
আমি স্টিফানের উত্তরটি (11 সেপ্টেম্বর '13) পছন্দ করি তবে এটি কিছুটা শক্তিশালী করতে চাই:
যদি ভেক্টরটি নাল টার্মিনেটর দিয়ে শেষ হয় তবে আপনার (v.begin (), v.end ()) ব্যবহার করা উচিত নয়: আপনার সি ++ 17 এর আগে v.data () (এবং & v [0] ব্যবহার করা উচিত) ।
যদি ভি এর নাল টার্মিনেটর না থাকে তবে আপনার (v.begin (), v.end ()) ব্যবহার করা উচিত।
আপনি যদি শুরুর () এবং শেষ () ব্যবহার করেন এবং ভেক্টরটির একটি সমাপ্তি শূন্য থাকে, আপনি উদাহরণস্বরূপ একটি স্ট্রিং "abc \ 0" দিয়ে শেষ করবেন, এটি দৈর্ঘ্য 4, তবে সত্যই কেবল "এবিসি" হওয়া উচিত।
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());
std::vector<char> v2(std::move(v))তবেstd::stringনতুন অবজেক্ট হিসাবে।