std::string::npos
নিম্নলিখিত কোডের স্নিপেটে বাক্যাংশটির অর্থ কী ?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
উত্তর:
এর অর্থ পাওয়া যায় নি।
এটি সাধারণত এর মতো সংজ্ঞায়িত হয়:
static const size_t npos = -1;
It is better to compare to npos instead of -1 because the code is more legible.
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
এবং pos:4294967295 npos: 4294967295
ম্যাকের মধ্যে পেয়েছি pos:4294967295 npos: 18446744073709551615
। এটি ঠিক বলে মনে হচ্ছে না ... ভালভাবেই আমি এর -1
পরিবর্তে তুলনা করার পরামর্শ দিইstd::string::npos
string::npos
একটি ধ্রুবক (সম্ভবত -1
) একটি অ-অবস্থানের প্রতিনিধিত্ব করে। find
প্যাটার্নটি পাওয়া না গেলে এটি পদ্ধতিতে ফিরে আসে ।
এর জন্য নথিটি string::npos
বলে:
আকারের একটি ধরণের উপাদানের জন্য সর্বোচ্চ সম্ভাব্য মান সহ এনপোস একটি স্থিতিশীল সদস্যের ধ্রুবক মান।
রিটার্ন মান হিসাবে এটি ব্যর্থতা নির্দেশ করতে সাধারণত ব্যবহৃত হয়।
This constant is actually defined with a value of -1 (for any trait), which because size_t is an unsigned integral type, becomes the largest possible representable value for this type.
size_t
is an unsigned variable, thus 'unsigned value = - 1' automatically makes it the largest possible value for size_t
: 18446744073709551615
std::string::npos
is implementation defined index that is always out of bounds of any std::string
instance. Various std::string
functions return it or accept it to signal beyond the end of the string situation. It is usually of some unsigned integer type and its value is usually std::numeric_limits<std::string::size_type>::max ()
which is (thanks to the standard integer promotions) usually comparable to -1
.
আমাদের string::size_type
ফাংশনটির রিটার্ন টাইপের জন্য ব্যবহার করতে হবে অন্যথায় তুলনা string::npos
কাজ নাও করতে পারে।
size_type
, যা স্ট্রিং এর বরাদ্দকারী দ্বারা সংজ্ঞায়িত করা হয়, একটি unsigned
অবিচ্ছেদ্য প্রকার হতে হবে । ডিফল্ট বরাদ্দকারী, বরাদ্দকারী, size_t
হিসাবে টাইপ ব্যবহার করে size_type
। যেহেতু -1
একটি স্বাক্ষরবিহীন ইন্টিগ্রাল টাইপে রূপান্তরিত হয়েছে, এনপোস হ'ল এটির সর্বাধিক স্বাক্ষরিত মান। তবে সঠিক মান টাইপের সঠিক সংজ্ঞা উপর নির্ভর করে size_type
। দুর্ভাগ্যক্রমে, এই সর্বোচ্চ মান পৃথক হয়। প্রকৃতপক্ষে, প্রকারগুলির আকার (unsigned long)-1
পৃথক (unsigned short)-
হলে 1 থেকে পৃথক। সুতরাং, তুলনা
idx == std::string::npos
আইডিএক্সের মান -1
এবং আইডেক্স রয়েছে এবং string::npos
বিভিন্ন ধরণের থাকলে মিথ্যা ফল দিতে পারে :
std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}
এই ত্রুটিটি এড়ানোর একটি উপায় অনুসন্ধানটি সরাসরি ব্যর্থ হয় কিনা তা যাচাই করা:
if (s.find("hi") == std::string::npos) {
...
}
তবে প্রায়শই আপনার মিলের অক্ষর অবস্থানের সূচক প্রয়োজন। সুতরাং, আর একটি সহজ সমাধান হল এনপোসের জন্য আপনার নিজের স্বাক্ষরিত মানটি সংজ্ঞায়িত করা:
const int NPOS = -1;
এখন তুলনাটি কিছুটা আলাদা এবং আরও সুবিধাজনক দেখাচ্ছে:
if (idx == NPOS) { // works almost always
...
}
স্ট্রিংয়ের মান :: এনপোস 18446744073709551615. কোনও স্ট্রিং পাওয়া না গেলে এটির মান ফিরে আসে returned
18446744073709551615
64-বিটের জন্য আদর্শ হবে std::size_t
, এটি সর্বাধিক -৪-বিট স্বাক্ষরযুক্ত মান।
এনপোস হ'ল একটি টোকেন মান যা আপনাকে জানায় যে () কিছুই খুঁজে পায় নি (সম্ভবত -1 বা এর মতো কিছু)। () প্যারামিটারের প্রথম উপস্থিতির জন্য অনুসন্ধান করে এবং প্যারামিটারটি শুরু হয় এমন সূচিটি দেয়। উদাহরণ স্বরূপ,
string name = "asad.txt";
int i = name.find(".txt");
//i holds the value 4 now, that's the index at which ".txt" starts
if (i==string::npos) //if ".txt" was NOT found - in this case it was, so this condition is false
name.append(".txt");
স্ট্যাটিক কনস্ট সাইজ_ট এনপোস = -1;
আকার_t এর জন্য সর্বাধিক মান
আকারের একটি ধরণের উপাদানের জন্য সর্বোচ্চ সম্ভাব্য মান সহ এনপোস একটি স্থিতিশীল সদস্যের ধ্রুবক মান।
এই মানটি যখন স্ট্রিংয়ের সদস্য ফাংশনে লেন (বা সুবলেন) প্যারামিটারের মান হিসাবে ব্যবহৃত হয়, তার অর্থ "স্ট্রিংয়ের শেষ অবধি"।
প্রত্যাবর্তনের মান হিসাবে, এটি সাধারণত কোনও মিলের ইঙ্গিত দিতে ব্যবহৃত হয়।
এই ধ্রুবকটি -1 এর মান দিয়ে সংজ্ঞায়িত করা হয়, কারণ সাইজ_টি একটি স্বাক্ষরবিহীন ইন্টিগ্রাল টাইপ, এটি এই ধরণের জন্য সবচেয়ে বড় সম্ভাব্য প্রতিনিধিত্বযোগ্য মান।
সি ++ 17 এর এই দিনগুলির জন্য একটি উত্তর, যখন আমাদের রয়েছে std::optional
:
If you squint a bit and pretend std::string::find()
returns an std::optional<std::string::size_type>
(which it sort of should...) - then the condition becomes:
auto position = str.find(str2);
if ( position.has_value() ) {
std::cout << "first 'needle' found at: " << found.value() << std::endl;
}