স্টাড :: স্ট্রিংয়ের শেষ উপাদানটি পান


87

আমি ভাবছিলাম যে এর মতো একটি স্ট্রিংয়ের শেষ চরিত্রটি পাওয়ার মতো কোনও সংক্ষেপণ বা আরও মার্জিত উপায় আছে:

char lastChar = myString.at( myString.length() - 1 );

এমন কিছু myString.back()আছে বলে মনে হচ্ছে না to সমতুল্য কি আছে?


আমি মনে করি এটি প্রয়োজনীয় নয়, কারণ সরবরাহিত ফাংশনগুলি দিয়ে আপনি এটি খুব সহজেই করতে পারেন।
হোং লং

4
সেই যুক্তিটি ধারক শ্রেণীর পাশাপাশি থাকবে।
দেভে

উত্তর:


130

সি ++ 11 এবং এর বাইরে, আপনি backসদস্য ফাংশনটি ব্যবহার করতে পারেন :

char ch = myStr.back();

সি ++ তে, std::string::backকোনও তদারকির কারণে পাওয়া যায় না তবে আপনি reverse_iteratorযেখান থেকে ফিরে আসেন তা ডিফারেন্স করে আপনি এটি পেতে পারেন rbegin:

char ch = *myStr.rbegin();

উভয় ক্ষেত্রেই স্ট্রিংটিতে আসলে কমপক্ষে একটি চরিত্র রয়েছে তা নিশ্চিত করতে সাবধান হন! অন্যথায়, আপনি অনির্ধারিত আচরণ পাবেন যা একটি খারাপ কাজ।

আশাকরি এটা সাহায্য করবে!


13
একটি পিছনে () ফাংশন সি ++ 11
এডিডি

4
@ এডিডি- এটি নির্দেশ করার জন্য ধন্যবাদ! আমি আমার উত্তর অনুসারে আপডেট করেছি।
টেম্পলেটটিফাইফ

দ্রষ্টব্য: উপলভ্য হওয়ার --std=c++11জন্য আমাকে g ++ জোর করে সংকলন back()করতে হয়েছিল।
জুলিয়ান হার্টি

আমি বিশ্বাস করি যে জুলিয়ান হার্টি বেশিরভাগ সি ++ ১১ টি বৈশিষ্ট্যের ক্ষেত্রে এটি সত্য। :-)
টেম্পলেটটিফাইফ

22

আপনি সম্ভবত প্রথমে স্ট্রিংয়ের দৈর্ঘ্য পরীক্ষা করতে চান এবং এর মতো কিছু করতে চান:

if (!myStr.empty())
{
    char lastChar = *myStr.rbegin();
}

4
আপনাকে দৈর্ঘ্য পরীক্ষা করতে হবে না। যদি এটি খালি স্ট্রিং হয় তবে আপনি কেবল '\ 0' লাস্টচারে সঞ্চিত হন।
মার্ক লোজার

4
@ মার্কলয়েজার: এটি সত্য নয়। *myStr.end()একই মত না myStr[myStr.size()]! এবং, এটি ছিল এমনকি myStr.rbegin()সমতুল্য myStr.end()-1, যা খালি স্ট্রিংয়ে স্পষ্টত অবৈধ।
অরবিট

7

আপনি কোনও ফাংশন টেমপ্লেট লিখতে backপারেন যা সাধারণ পাত্রে সদস্য ফাংশনকে প্রতিনিধিত্ব করে এবং স্ট্রিংগুলির জন্য অনুপস্থিত কার্যকারিতা প্রয়োগ করে এমন একটি সাধারণ ফাংশন:

template <typename C>
typename C::reference back(C& container)
{
    return container.back();
}

template <typename C>
typename C::const_reference back(const C& container)
{
    return container.back();
}

char& back(std::string& str)
{
    return *(str.end() - 1);
}

char back(const std::string& str)
{
    return *(str.end() - 1);
}

তারপরে আপনি স্ট্রিং বা ভেক্টর back(foo)কিনা তা চিন্তা না করেই বলতে পারেন foo


2

*(myString.end() - 1)হতে পারে? এটি হুবহু মার্জিত নয়।

একটি পাইথন-এস্কিউ myString.at(-1)ইতিমধ্যে স্ফীত শ্রেণীর অনেক বেশি জিজ্ঞাসা করবে।

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