Apa arti frasa std::string::npos
dalam cuplikan kode berikut?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Jawaban:
Artinya tidak ditemukan.
Biasanya didefinisikan seperti ini:
static const size_t npos = -1;
Lebih baik membandingkan dengan npos daripada -1 karena kodenya lebih terbaca.
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
dan mendapatkan pos:4294967295 npos: 4294967295
ketika saya menjalankannya di Windows tetapi di Mac saya dapatkan pos:4294967295 npos: 18446744073709551615
. Itu tidak benar ... baik cara saya sarankan dibandingkan dengan -1
bukanstd::string::npos
string::npos
adalah konstanta (mungkin -1
) mewakili non-posisi. Ini dikembalikan oleh metode find
ketika pola tidak ditemukan.
Dokumen untuk string::npos
mengatakan:
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.
size_t
adalah variabel unsigned, jadi 'unsigned value = - 1' secara otomatis menjadikannya nilai terbesar untuk size_t
: 18446744073709551615
std::string::npos
adalah implementasi yang ditentukan indeks yang selalu di luar batas dari setiap std::string
contoh. Berbagai std::string
fungsi 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
.
kita harus menggunakan string::size_type
tipe kembalian dari fungsi find jika tidak, perbandingannya string::npos
mungkin tidak berfungsi.
size_type
, yang ditentukan oleh pengalokasi string, harus berupa unsigned
tipe integral. Pengalokasi default, pengalokasi, menggunakan tipe size_t
sebagai size_type
. Karena -1
diubah 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)-1
berbeda dari (unsigned short)-
1 jika ukuran jenisnya berbeda. Demikian perbandingannya
idx == std::string::npos
mungkin menghasilkan false jika idx memiliki nilai -1
dan idx dan string::npos
memiliki 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
...
}
Nilai string :: npos adalah 18446744073709551615. Ini adalah nilai yang dikembalikan jika tidak ada string yang ditemukan.
18446744073709551615
akan menjadi tipikal untuk 64-bit std::size_t
, itu adalah nilai unsigned maksimum 64-bit.
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");
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.
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;
}