Apa arti string :: npos dalam kode ini?


97

Apa arti frasa std::string::nposdalam cuplikan kode berikut?

found = str.find(str2);

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

Jawaban:


110

Artinya tidak ditemukan.

Biasanya didefinisikan seperti ini:

static const size_t npos = -1;

Lebih baik membandingkan dengan npos daripada -1 karena kodenya lebih terbaca.


3
Membandingkan == -1 mungkin juga membuat beberapa orang berpikir bahwa mereka dapat mengubahnya menjadi <0 yang BUKAN hal yang sama dan tidak akan berfungsi.
Andy Dent

Hanya ingin tahu apakah ada yang menemukan ini, atau hanya saya ... Saya menjalankan cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;dan mendapatkan pos:4294967295 npos: 4294967295ketika saya menjalankannya di Windows tetapi di Mac saya dapatkan pos:4294967295 npos: 18446744073709551615. Itu tidak benar ... baik cara saya sarankan dibandingkan dengan -1bukanstd::string::npos
user1135469

@ user1135469 jika Anda melihat jawaban dari codaddict di bawah ( stackoverflow.com/a/3827997/752842 ) atau dari Sebastian Raschka, saya pikir apa yang Anda dapatkan akan masuk akal. Dan saya akan merekomendasikan menggunakan npos, karena saya mencoba menggunakan -1 dan tidak berfungsi dengan baik dalam kondisi saya menggunakannya.
Dzyann

51

string::nposadalah konstanta (mungkin -1) mewakili non-posisi. Ini dikembalikan oleh metode findketika pola tidak ditemukan.


15
+1 untuk benar-benar menunjukkan derivasi npos = no-pos yang membuatnya mudah diingat. Jelas sekali Anda tidak akan memikirkannya setelah Anda mengetahuinya, tetapi bagi seseorang yang melihat huruf-huruf itu untuk pertama kalinya mungkin tidak akan berbunyi klik ...?
Tony Delroy

4
salah pada 47 level ... npos adalah size_t, artinya tidak bisa negatif ... arti sebenarnya adalah max_index, 18446744073709551615 untuk ukuran 64
bit_t

25

Dokumen untuk string::nposmengatakan:

npos adalah nilai konstanta anggota statis dengan kemungkinan nilai terbesar untuk elemen tipe size_t.

Sebagai nilai pengembalian biasanya digunakan untuk menunjukkan kegagalan.

Konstanta ini sebenarnya didefinisikan dengan nilai -1 (untuk sifat apa pun), yang karena size_t adalah tipe integral unsigned, menjadi nilai terwakili terbesar yang mungkin untuk jenis ini.


17

size_tadalah variabel unsigned, jadi 'unsigned value = - 1' secara otomatis menjadikannya nilai terbesar untuk size_t: 18446744073709551615


size_t adalah unsigned int untuk kompilator 32 bit; unsigned long long int untuk kompiler 64 bit .. Menyetelnya ke -1 membuatnya memiliki nilai maksimum dari tipe unsigned.
sudheerbb

9

std::string::nposadalah implementasi yang ditentukan indeks yang selalu di luar batas dari setiap std::stringcontoh. Berbagai std::stringfungsi mengembalikannya atau menerimanya sebagai sinyal di luar akhir situasi string. Ini biasanya dari beberapa tipe integer unsigned dan nilainya biasanya std::numeric_limits<std::string::size_type>::max ()(berkat promosi integer standar) biasanya sebanding dengan -1.


4

kita harus menggunakan string::size_typetipe kembalian dari fungsi find jika tidak, perbandingannya string::nposmungkin tidak berfungsi. size_type, yang ditentukan oleh pengalokasi string, harus berupa unsigned tipe integral. Pengalokasi default, pengalokasi, menggunakan tipe size_tsebagai size_type. Karena -1diubah menjadi tipe integral unsigned, npos adalah nilai unsigned maksimum dari tipenya. Namun, nilai pastinya bergantung pada definisi jenis yang tepat size_type. Sayangnya, nilai maksimum ini berbeda. Faktanya, (unsigned long)-1berbeda dari (unsigned short)-1 jika ukuran jenisnya berbeda. Demikian perbandingannya

idx == std::string::npos

mungkin menghasilkan false jika idx memiliki nilai -1dan idx dan string::nposmemiliki tipe yang berbeda:

std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}

Salah satu cara untuk menghindari kesalahan ini adalah dengan memeriksa apakah pencarian gagal secara langsung:

if (s.find("hi") == std::string::npos) {
...
}

Namun, seringkali Anda membutuhkan indeks posisi karakter yang cocok. Jadi, solusi sederhana lainnya adalah menentukan nilai yang Anda tandatangani sendiri untuk npos:

const int NPOS = -1;

Sekarang perbandingannya terlihat sedikit berbeda dan bahkan lebih nyaman:

if (idx == NPOS) { // works almost always
...
}

3

foundakan terjadi nposjika gagal menemukan substring dalam string pencarian.


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

Itu dikembalikan oleh fungsi string yang menunjukkan kesalahan / tidak ditemukan dll.


1

Nilai string :: npos adalah 18446744073709551615. Ini adalah nilai yang dikembalikan jika tidak ada string yang ditemukan.


Nilai sebenarnya adalah implementasi yang ditentukan dan tidak relevan. Dalam praktiknya, bagaimanapun, nilainya 18446744073709551615akan menjadi tipikal untuk 64-bit std::size_t, itu adalah nilai unsigned maksimum 64-bit.
Alex Guteniev

0

npos hanyalah nilai token yang memberi tahu Anda bahwa find () tidak menemukan apa pun (mungkin -1 atau sesuatu seperti itu). find () memeriksa kemunculan pertama parameter, dan mengembalikan indeks di mana parameter dimulai. Sebagai contoh,

  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");

Kode ini tidak akan cocok untuk "asad.other" karena find () tidak mengembalikan int.
LogicMagic

0

statis ukuran_t konstanta npos = -1;

Nilai maksimum untuk size_t

npos adalah nilai konstanta anggota statis dengan kemungkinan nilai terbesar untuk elemen tipe size_t.

Nilai ini, bila digunakan sebagai nilai untuk parameter len (atau sublen) dalam fungsi anggota string, berarti "sampai akhir string".

Sebagai nilai yang dikembalikan, biasanya digunakan untuk menunjukkan tidak ada kecocokan.

Konstanta ini didefinisikan dengan nilai -1, yang karena size_t adalah tipe integral unsigned, ini adalah nilai terwakili terbesar yang mungkin untuk jenis ini.


0

Jawaban untuk C ++ 17 saat ini, ketika kita memiliki std::optional:

Jika Anda menyipitkan mata sedikit dan berpura-pura std::string::find()mengembalikan std::optional<std::string::size_type>(yang seharusnya ...) - maka kondisinya menjadi:

auto position = str.find(str2);

if ( position.has_value() ) {
    std::cout << "first 'needle' found at: " << found.value() << std::endl;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.