স্টাড :: স্টু নেই কেন?


96

সি ++ 11 কিছু নতুন স্ট্রিং রূপান্তর ফাংশন যুক্ত করেছে:

http://en.cppreferences.com/w/cpp/string/basic_string/stoul

এর মধ্যে রয়েছে স্টোই (স্ট্রিং থেকে ইনট), স্টল (স্ট্রিং থেকে লম্বা), স্টল (স্ট্রিং থেকে লম্বা লম্বা), স্টল (স্বাক্ষরযুক্ত স্বাক্ষরের দীর্ঘ থেকে স্ট্রিং), স্টল (স্বাক্ষরযুক্ত স্বাক্ষরিত দীর্ঘ দীর্ঘ)। এর অনুপস্থিতিতে উল্লেখযোগ্য হ'ল স্টো (স্বাক্ষরবিহীন স্বাক্ষরিত) ফাংশন। এটির প্রয়োজন নেই এমন অন্য কোনও কারণ রয়েছে যা অন্যরা সবাই করেছেন?

সম্পর্কিত: সি ++ 11 এ কোনও "স্টো {সংক্ষিপ্ত, স্বাক্ষরযুক্ত স্বল্প}" ফাংশন নেই?


6
আমার প্রশ্নের উদ্দেশ্য ছিল "কেবল স্টুল ব্যবহারের কিছু অ-সুস্পষ্ট ত্রুটি আছে" এর ধারায় আরও বেশি হওয়া। স্পষ্টতই এটি টেমপ্লেট তাত্ক্ষণিকের সাথে জগাখিচুড়ি করবে, তবে এমন অন্য কিছু আছে যা আমি বিবেচনা করছি না? কেন এটিকে বাদ দেওয়া হয়েছিল সে সম্পর্কে মন্তব্যগুলি দুর্দান্ত তবে গৌণ হবে।
ডেভিড স্টোন

13
@ নিকলবোলাস আমি দেখতে পাচ্ছি না কেন এটি গঠনমূলক নয়। এটি একটি পুরোপুরি বৈধ প্রশ্ন, কারণ আমি এই অসঙ্গতির কোনও কারণ দেখতে পাচ্ছি না এবং নতুনভাবে উত্তরগুলি সম্ভবত কিছু বিদ্যমান বৈধ সম্পর্কে অন্তর্দৃষ্টি দিতে পারে তবে এর সুস্পষ্ট কারণটি নয়।
খ্রিস্টান রাউ

4
@ শেঠ কার্নেগি ওয়েল, আপনার প্ল্যাটফর্মটি (এবং সম্ভবত বেশিরভাগ প্ল্যাটফর্মগুলি) যা করে তা কেবল অপ্রাসঙ্গিক, কারণ ন্যায়বিচার unsigned longনেই unsigned int
খ্রিস্টান রাউ

4
@ শেঠ কার্নেগি: আমার সাধারন কম্পিউটারে, unsigned long64 বিট এবং unsigned int32. এগুলি বিভিন্ন ধরণের, এবং একে অপরের মতো বলে মনে করা যায় না।
মাইক সিমুর

4
@ নিকলবোলাস লাইক বলেছিলেন, ওপি (এবং আমি) জানি না যে এটি অনুমানযোগ্য, কারণ এটির জন্য সি ++ এর ভাষা অভ্যন্তরীণ গভীরে কবর দেওয়ার জন্য একটি সঠিক বৈধ কারণ থাকতে পারে। তবে আপনি যেহেতু এটি অনুমানমূলক বলে আমার ধারণা অনুমান করার কোনও কারণ নেই। তবে আবার, সম্ভবত কোনও সি ++ 11-দায়বদ্ধ ব্যক্তি এখনও এর উত্তর দিতে পারে। এটি কোনও "ওয়াহ ওয়াহ, কোথায় সেই অভিশাপ stou" নেই, তবে এই প্রশ্নটি এই সুস্পষ্ট অসামঞ্জস্যতার জন্য সম্ভবত একটি নির্দিষ্ট কারণ জিজ্ঞাসা করছে question যদি আপনি জানেন যে এরকম কোনও কারণ নেই, তবে ভাল, এটি উত্তর হিসাবে পোস্ট করুন।
খ্রিস্টান রাউ

উত্তর:


29

সর্বাধিক পট উত্তরটি হ'ল সি লাইব্রেরির কোনও সম্পর্কিত নয় " strtou", এবং সি ++ 11 স্ট্রিং ফাংশনগুলি কেবল সি লাইব্রেরির ফাংশনগুলির চারপাশে কেবল পাতলা পর্দাযুক্ত মোড়ক: std::sto*ফাংশন আয়না strto*এবং std::to_stringফাংশনগুলি ব্যবহার করে sprintf


সম্পাদনা: হিসাবে KennyTM তুলে ধরে, উভয় stoiএবং stolব্যবহার strtolঅন্তর্নিহিত রূপান্তর ফাংশন হিসাবে, কিন্তু এটি এখনও রহস্যময় কারণে যখন অস্তিত্ব আছে stoulযে ব্যবহারসমূহ strtoul, কোন সংশ্লিষ্ট stou


14
আপনি কি জানেন যে সি ++ কমিটি কেন এই জাতীয় সি-ইশ পদ্ধতির জন্য যাওয়ার সিদ্ধান্ত নিয়েছে? এরকম কিছু দেখে boost::lexical_cast<>()মনে হয় যে আরও কিছু কাজ করার পদ্ধতি C ++।
পল মানতা

4
এই বাস্তবায়ন বিশদগুলি কি সত্যিই মান-সংজ্ঞায়িত?
অরবিট

4
@ লাইটনেসেসেসিনঅরবিট: sto*সি সি ++ ১১ 21.5 / 1 এর জন্য: প্রভাব: প্রথম দুটি ফাংশন স্ট্র্টল (আরআরসিআর_সেট্র (), পিটিআর, বেস) এবং শেষ তিনটি ফাংশন কল করে স্ট্র্টল (আরআরসিআর_সেটার), পিটিআর, বেস ), স্ট্র্টল (str.c_str (), পিটিআর, বেস), এবং যথাক্রমে strtoull (str.c_str (), ptr, বেস)
মাইক সিমুর

12
সি ++ স্ট্যান্ডার্ডটি "কল করে অবশ্যই প্রয়োগ করা উচিত ..." তা বিবেচ্য নয়, কারণ সি ++ স্ট্যান্ডার্ডটিতে এখনও বিশ্বব্যাপী নিয়ম রয়েছে: যদি স্ট্যান্ডার্ডটি std::sto*অবশ্যই সি লাইব্রেরির ফাংশনগুলির জন্য মোড়ক হিসাবে প্রয়োগ করতে হবে, এবং একটি বৈধ প্রোগ্রাম বলতে পারে না যে তারা গোপনে আলাদাভাবে প্রয়োগ করা হয়নি, বাস্তবায়ন বৈধ।

4
পুরোপুরি অফ-টপিক, আমি মনে করি বুস্ট / লেক্সিক্যাল_কাস্টের মতো আইওস্ট্রিমে ব্যবহার না করার বাস্তব কারণগুলি নিছক পারফরম্যান্স; আমি বিশ্বাস করি যে আইওস্ট্রিমে স্ট্রটল ইত্যাদির বিপক্ষে যথেষ্ট ব্যবধানে হেরে যায়।
কেরেক এসবি

22

আমি জানি না কেন stoiবিদ্যমান আছে তবে তা নয় stouতবে stoulঅনুমানের মধ্যে এবং পার্থক্যের মধ্যে পার্থক্য কেবলমাত্র এটির পরিসীমাতে রয়েছে stouকিনা তা পরীক্ষা করা হবে unsigned:

unsigned stou(std::string const & str, size_t * idx = 0, int base = 10) {
    unsigned long result = std::stoul(str, idx, base);
    if (result > std::numeric_limits<unsigned>::max()) {
        throw std::out_of_range("stou");
    }
    return result;
}

(একইভাবে, ঠিক একটি ভিন্ন পরিসরের চেকের stoiসাথেও অনুরূপ stol; তবে এটি ইতিমধ্যে বিদ্যমান তাই কীভাবে এটি বাস্তবায়ন করা যায় তা নিয়ে চিন্তা করার দরকার নেই।)


মধ্যে পার্থক্য stoiএবং stol, বা stolএবং stollএকমাত্র একটি সীমার চেক করুন।
হোসেইন

4
@ হোসেইন: হ্যাঁ এর মধ্যে stoiএবং stol। তবে stolএবং stollকেবলমাত্র পরিসীমা চেকেই আলাদা হয় না, তারা বিভিন্ন লাইব্রেরির ফাংশনগুলিকে কল করে।
বেন ভয়েগ্ট

0
unsigned long ulval = std::stoul(buf);
unsigned long mask = ~0xffffffffl;
unsigned int uival;
if( (ulval & mask) == 0 )
    uival = (unsigned int)ulval;
else {
    ...range error...
}

মুখোশগুলিতে প্রকাশিত বিটগুলিতে প্রত্যাশিত মান আকারের সাথে এটি করার জন্য মুখোশ ব্যবহার করা, 32-বিট ইনট বনাম 32-বিট লম্বা জন্য, তবে 32-বিট ইনট বনাম 32-বিট লম্বা জন্যও এই কাজটি তৈরি করবে।

-৪-বিট লম্বা ক্ষেত্রে, x 0xffffffffl 0xffffffff00000000 হয়ে যাবে এবং এভাবে দেখা যাবে শীর্ষ 32 বিটের কোনও সেট করা আছে কিনা। 32-বিট দীর্ঘ দীর্ঘায়িত হয়ে এটি 0xffffffffl 0x00000000 হয়ে যায় এবং মাস্ক চেকটি সর্বদা শূন্য হবে।

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