Std :: vector <car> থেকে std :: স্ট্রিং কিভাবে তৈরি করবেন?


115

সংক্ষিপ্ত (স্পষ্টত) প্রথমে সি স্টাইলের স্ট্রিং তৈরির পরে স্টডি :: স্ট্রিং তৈরি করতে এটি ব্যবহার করে, চরগুলির ভেক্টর থেকে স্ট্রিং আরম্ভ করার জন্য কি আরও দ্রুত / বিকল্প / "আরও ভাল" উপায় আছে?


4
এটি অনুলিপি না করে করা যায়? অন্য কথায় এমন কিছু যা একই জিনিস যেমন করে std::vector<char> v2(std::move(v))তবে std::stringনতুন অবজেক্ট হিসাবে।
tobi_s

উত্তর:


197

ওয়েল, সর্বোত্তম উপায় নিম্নলিখিত নির্মাণকারী ব্যবহার করা হয়:

template<class InputIterator> string (InputIterator begin, InputIterator end);

যা এরকম কিছু হতে পারে:

std::vector<char> v;
std::string str(v.begin(), v.end());

41

আমি মনে করি আপনি ঠিক করতে পারেন

std::string s( MyVector.begin(), MyVector.end() );

যেখানে মাইভেক্টরটি আপনার স্ট্যান্ড :: ভেক্টর।


1
ভিএস ২০১৩ ব্যতীত যা রানটাইমের সময় অবৈধ পুনরাবৃত্তকারী সম্পর্কে জোর দিয়েছিল, যদি না আপনি সেট করেন _ITERATOR_DEBUG_LEVEL=1( তবে এই ক্ষেত্রে এটি সূক্ষ্ম কাজ করে বলে মনে হচ্ছে)।
ক্যামেরন

35

সি ++ 11 দিয়ে আপনি করতে পারেন std::string(v.data())বা, যদি আপনার ভেক্টরটির '\0'শেষে একটি থাকে না std::string(v.data(), v.size()),।


এমনকি সি ++ 98 এর সাথেও, আমি বিশ্বাস করি আপনি স্টাডি :: স্ট্রিং (& v [0]) করতে পারবেন। এটি অবশ্যই, যদি ভেক্টর নাল-টার্মিনেট হয়।
জ্যামি

1
@ জ্যামি: যাইহোক, সি ++ 98 তে, string(&v[0], v.size())এছাড়াও কাজ করা উচিত, তবে কেবল তখনই assert(not v.empty());, যেহেতু যদি ভেক্টরটি খালি থাকে, v[0]এবং উভয়ই v.front()অপরিজ্ঞাত আচরণের জন্য প্রার্থনা করবে। এটি, অ্যাড্রেস-অফ অপারেটরটি ব্যবহার না করার সিনট্যাকটিক সরলতা বাদে সি ++ 11 এর data()ফাংশনটির আসল উপকারিতা , যা খালি ভেক্টর এমনকি এমনকি কাজ করে।
অ্যাডাম এইচ পিটারসন

খুবই সত্য. দুর্ভাগ্যক্রমে, আমার প্রকল্পটি অদূর ভবিষ্যতের জন্য ভিজ্যুয়াল স্টুডিও ২০০৮ এ আটকে আছে। প্রথমে ভেক্টরের দৈর্ঘ্য পরীক্ষা করার বিষয়ে ঠিক।
জেমি

যদি ভেক্টরটিতে একটি '\ 0' না থাকে, তবে এটি আরও std::string(v.data())দীর্ঘ স্ট্রিংয়ের নেতৃত্ব দিতে পারে। সুতরাং এইভাবে ব্যবহার করবেন না।
heLomaN

@ হেলোমন: এতে কী দোষ হয়েছে std::string(v.data(), v.size()), যা সঠিক কারণে উত্তরে উল্লেখ করা হয়েছিল?
জেড

12
std::string s(v.begin(), v.end());

যেখানে ভি বেশ কয়েকবার পুনরাবৃত্তিযোগ্য। (সুনির্দিষ্টভাবে শুরু () এবং শেষ () অবশ্যই ইনপুটআইটিরেটরে ফিরতে হবে))


3

কেবল সম্পূর্ণতার জন্য, অন্য একটি উপায় হ'ল std::string(&v[0])(যদিও আপনার স্ট্রিংটি নাল-টার্মিনেটেড রয়েছে এবং std::string(v.data())এটি সাধারণত পছন্দ করা উচিত তা নিশ্চিত করা দরকার ।

পার্থক্যটি হ'ল আপনি প্রাক্তন কৌশলটি ভেক্টরকে ফাংশনগুলিতে পাস করার জন্য ব্যবহার করতে পারেন যা বাফারটি সংশোধন করতে চায়, যা আপনি .ডাটা () দিয়ে করতে পারবেন না।


আপনি data()বাফারটি সংশোধন করতে কেন ব্যবহার করতে পারবেন না ? আমার কাছে দেখে মনে হচ্ছে আপনি যদি data()কোন কনস্ট্যান্ট ভেক্টরকে কল করেন তবে এটি একটি ফিরে আসবে T *(এবং যদি আপনার ভেক্টর কনস্ট হয় তবে 'v [0] any T const &যাইহোক ফেরত আসতে পারে )।
অ্যাডাম এইচ পিটারসন

@ অ্যাডামএইচ.পিটারসন এটি স্ট্যান্ডার্ডের উপর নজরদারি বলে মনে হচ্ছে। স্ট্যান্ড :: ভেক্টরের ডেটাতে কনস্ট এবং নন-কনস্ট্যান্ট উভয়ই ফাংশন রয়েছে, যদিও বর্তমান স্ট্যান্ডার্ডে, স্টাড :: স্ট্রিংটিতে কেবল একটি কনস্ট ফাংশন রয়েছে: en.cppreferences.com/w/cpp/string/basic_string/data নোট করুন যে C ++ 17 একটি অবিচ্ছিন্ন সংস্করণ যুক্ত করে, তাই এটি অনির্দিষ্টকালের জন্য নাও হতে পারে - তবে, বর্তমান স্ট্যান্ডার্ডটি বলেছে "ডেটা দিয়ে অ্যাক্সেস করা চরিত্রের অ্যারেটি সংশোধন করা আচরণের সংজ্ঞায়িত হয়েছে" "
দাঙ্গা

এটি সত্য হবে যদি vস্ট্রিং থাকে তবে লক্ষ্য ধরণটি একটি স্ট্রিং এবং vএকটি ভেক্টর। (তবে এটি দেখতে খুব ভাল লাগল যে সি ++ 17 ভেক্টরটির সাথে স্ট্রিংসকে সমতা দেবে))
অ্যাডাম এইচ পিটারসন

@ অ্যাডামএইচ.পিটারসন আপনি অবশ্যই আছেন। কিছুক্ষণ আগে প্রশ্নের উত্তর দেওয়া হয়েছিল, আমি ধরে নিলাম পুরো প্রশ্নটি কেবল চেক ছাড়াই স্ট্রিং সম্পর্কে।
দাঙ্গা

2

আমি স্টিফানের উত্তরটি (11 সেপ্টেম্বর '13) পছন্দ করি তবে এটি কিছুটা শক্তিশালী করতে চাই:

যদি ভেক্টরটি নাল টার্মিনেটর দিয়ে শেষ হয় তবে আপনার (v.begin (), v.end ()) ব্যবহার করা উচিত নয়: আপনার সি ++ 17 এর আগে v.data () (এবং & v [0] ব্যবহার করা উচিত) ।

যদি ভি এর নাল টার্মিনেটর না থাকে তবে আপনার (v.begin (), v.end ()) ব্যবহার করা উচিত।

আপনি যদি শুরুর () এবং শেষ () ব্যবহার করেন এবং ভেক্টরটির একটি সমাপ্তি শূন্য থাকে, আপনি উদাহরণস্বরূপ একটি স্ট্রিং "abc \ 0" দিয়ে শেষ করবেন, এটি দৈর্ঘ্য 4, তবে সত্যই কেবল "এবিসি" হওয়া উচিত।


1
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());

আপনি কোড পাশাপাশি কিছু ব্যাখ্যা যোগ করতে পারেন?
পল ফ্লয়েড

1
সি ++ 11 স্ট্রিংয়ের গ্রন্থাগার টেম্পলেটটি ডিফল্ট (1) স্ট্রিং () হিসাবে অনুসরণ করে; অনুলিপি (2) স্ট্রিং (কনস্ট্রিং স্ট্রিং & স্ট্র); স্ট্রিং (3) স্ট্রিং (কনস্ট্রিং স্ট্রিং & স্ট্রিং, সাইজ_ট পোজ, সাইজ_টি লেন = এনপোস); সি-স্ট্রিং (4) স্ট্রিং (কনস্ট চর * গুলি) থেকে; বাফার (5) স্ট্রিং থেকে (কনস্টের চর * গুলি, আকার_ টি এন); ভরাট (6) স্ট্রিং (আকার_টি এন, চর গ); পরিসীমা (7) টেমপ্লেট <শ্রেণীর ইনপুটআইট্রেটার> স্ট্রিং (ইনপুটআইট্রেটর প্রথমে, ইনপুটআইট্রেটর সর্বশেষ); ইনিশিয়ালাইজার তালিকা (8) স্ট্রিং (ইনিশিয়ালার_লিস্ট <চাপ> আইএল); সরানো (9) স্ট্রিং (স্ট্রিং এন্ড & স্ট্রিং) নম্বরের; আমরা 7 ম টেমপ্লেট অনুসরণ করছি।
টেকটিজ

হাই @ টেকটিজ! আপনার পরবর্তী প্রশ্নের উত্তর দেওয়ার আগে একটি ভাল উত্তর লিখতে দয়া করে পড়ুন । আপনার থাকার জন্য উপভোগ করুন!
ডিগি

আপনি দয়া করে বিবরণ দিয়ে আপনার উত্তর সম্পাদনা করতে পারেন?
পল ফ্লয়েড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.