এই কোডটিতে স্ট্রিং :: এনপোস এর অর্থ কী?


97

std::string::nposনিম্নলিখিত কোডের স্নিপেটে বাক্যাংশটির অর্থ কী ?

found = str.find(str2);

if (found != std::string::npos)
    std::cout << "first 'needle' found at: " << int(found) << std::endl;

উত্তর:


110

এর অর্থ পাওয়া যায় নি।

এটি সাধারণত এর মতো সংজ্ঞায়িত হয়:

static const size_t npos = -1;

It is better to compare to npos instead of -1 because the code is more legible.


3
তুলনা == -1 এছাড়াও কিছু লোককে ভাবতে পারে যে তারা এটিকে <0 তে রূপান্তর করতে পারে যা একই জিনিস নয় এবং কাজ করবে না।
অ্যান্ডি ডেন্ট

কেবল ভাবছেন যে কেউ এগুলি পেরেছে কিনা, বা এটি কি কেবল আমার ... আমি উইন্ডোতে চালিত হয়ে চালাচ্ছি cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;এবং pos:4294967295 npos: 4294967295ম্যাকের মধ্যে পেয়েছি pos:4294967295 npos: 18446744073709551615। এটি ঠিক বলে মনে হচ্ছে না ... ভালভাবেই আমি এর -1পরিবর্তে তুলনা করার পরামর্শ দিইstd::string::npos
ইউজার 1135469

@ user1135469 আপনি উত্তর দেখি codaddict নিচে ( stackoverflow.com/a/3827997/752842 ) অথবা সেবাস্টিয়ান Raschka এর, আমি মনে করি তুমি কি অর্থে করতে হবে পাচ্ছেন। এবং আমি এনপোস ব্যবহারের পরামর্শ দেব, কারণ আমি -1 ব্যবহার করার চেষ্টা করেছি এবং আমি যে শর্তটি এটি ব্যবহার করছি তার অধীনে এটি সঠিকভাবে কাজ করছে না।
জাজান

51

string::nposএকটি ধ্রুবক (সম্ভবত -1) একটি অ-অবস্থানের প্রতিনিধিত্ব করে। findপ্যাটার্নটি পাওয়া না গেলে এটি পদ্ধতিতে ফিরে আসে ।


15
প্রকৃতপক্ষে এনপোস = নো-পজ ডেরাইভেশন দেখানোর জন্য +1 যা এটি মনে রাখা সহজ করে তোলে। এটি এতটা সুস্পষ্ট যে আপনি একবার এটি জানার পরে এটি সম্পর্কে চিন্তা করবেন না তবে প্রথমবারের মতো কেউ এই চিঠিগুলি দেখলে এটি ক্লিক নাও করতে পারে ...?
টনি ডেলরয়

4
47 টি স্তরে ভুল ... এনপোস আকারের আকারের, এর অর্থ এটি নেতিবাচক হতে পারে না ... আসল অর্থটি ম্যাক্স ইনডেক্স, 18446744073709551615 64৪ বিটের
আকারের_টায়

25

এর জন্য নথিটি 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.


17

size_t is an unsigned variable, thus 'unsigned value = - 1' automatically makes it the largest possible value for size_t: 18446744073709551615


size_t is unsigned int for 32 bit compiler; unsigned long long int for 64 bit compiler.. Setting it to -1 makes it have the max val of that unsigned type.
sudheerbb

9

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.


4

আমাদের 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
...
}

3

foundnposঅনুসন্ধানের স্ট্রিংয়ের সাবস্ট্রিংগুলি খুঁজে পেতে ব্যর্থতার ক্ষেত্রে হবে ।


1
$21.4 - "static const size_type npos = -1;"

এটি ত্রুটি / পাওয়া যায় না ইত্যাদি নির্দেশ করে স্ট্রিং ফাংশন দ্বারা ফিরে আসে


1

স্ট্রিংয়ের মান :: এনপোস 18446744073709551615. কোনও স্ট্রিং পাওয়া না গেলে এটির মান ফিরে আসে returned


প্রকৃত মান বাস্তবায়ন সংজ্ঞায়িত এবং অপ্রাসঙ্গিক। বাস্তবে, তবে মানটি 1844674407370955161564-বিটের জন্য আদর্শ হবে std::size_t, এটি সর্বাধিক -৪-বিট স্বাক্ষরযুক্ত মান।
অ্যালেক্স গুটেনিভ

0

এনপোস হ'ল একটি টোকেন মান যা আপনাকে জানায় যে () কিছুই খুঁজে পায় নি (সম্ভবত -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");

এই কোডটি "asad.other" এর জন্য ব্যবহৃত হবে না কারণ অনুসন্ধান () কোনও পূর্বাবস্থা ফেরায় না।
লজিকমাজিক

0

স্ট্যাটিক কনস্ট সাইজ_ট এনপোস = -1;

আকার_t এর জন্য সর্বাধিক মান

আকারের একটি ধরণের উপাদানের জন্য সর্বোচ্চ সম্ভাব্য মান সহ এনপোস একটি স্থিতিশীল সদস্যের ধ্রুবক মান।

এই মানটি যখন স্ট্রিংয়ের সদস্য ফাংশনে লেন (বা সুবলেন) প্যারামিটারের মান হিসাবে ব্যবহৃত হয়, তার অর্থ "স্ট্রিংয়ের শেষ অবধি"।

প্রত্যাবর্তনের মান হিসাবে, এটি সাধারণত কোনও মিলের ইঙ্গিত দিতে ব্যবহৃত হয়।

এই ধ্রুবকটি -1 এর মান দিয়ে সংজ্ঞায়িত করা হয়, কারণ সাইজ_টি একটি স্বাক্ষরবিহীন ইন্টিগ্রাল টাইপ, এটি এই ধরণের জন্য সবচেয়ে বড় সম্ভাব্য প্রতিনিধিত্বযোগ্য মান।


0

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