std::string::npos
Aşağıdaki kod parçacığındaki ifade ne anlama geliyor?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Yanıtlar:
Bulunamadı demek.
Genellikle şu şekilde tanımlanır:
static const size_t npos = -1;
Kod daha okunaklı olduğundan -1 yerine npos ile karşılaştırmak daha iyidir.
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
ve pos:4294967295 npos: 4294967295
Mac'te alırım pos:4294967295 npos: 18446744073709551615
. Doğru görünmüyor Yani ... Ben karşılaştırarak öneririz iyi bir yolu -1
yerinestd::string::npos
string::npos
sabit (muhtemelen -1
) olmayan bir konumu temsil eder. find
Kalıp bulunamadığında yöntemle döndürülür .
İçin belge string::npos
diyor ki:
npos, size_t türündeki bir öğe için olası en büyük değere sahip statik bir üye sabit değeridir.
Dönüş değeri olarak genellikle başarısızlığı belirtmek için kullanılır.
Bu sabit aslında -1 değeriyle (herhangi bir özellik için) tanımlanır; bu, size_t işaretsiz bir integral türü olduğundan, bu tür için olası en büyük temsil edilebilir değer haline gelir.
size_t
işaretsiz bir değişkendir, bu nedenle 'işaretsiz değer = - 1' onu otomatik olarak aşağıdakiler için olası en büyük değer yapar size_t
: 18446744073709551615
std::string::npos
her zaman herhangi bir std::string
örneğin sınırları dışında olan uygulama tanımlı dizindir . Çeşitli std::string
işlevler onu döndürür veya dizi durumunun sonunun ötesinde sinyal vermesini kabul eder. Genellikle işaretsiz tam sayı tipindedir ve değeri genellikle std::numeric_limits<std::string::size_type>::max ()
(standart tamsayı yükseltmeleri sayesinde) ile karşılaştırılabilir -1
.
string::size_type
bul işlevinin dönüş türü için kullanmamız gerekir, aksi takdirde ile karşılaştırma string::npos
çalışmayabilir.
size_type
dizenin ayırıcısı tarafından tanımlanan, unsigned
integral bir tür olmalıdır . Varsayılan ayırıcı, ayırıcı, türü size_t
olarak kullanır size_type
. Çünkü -1
işaretsiz bir entegre tip dönüştürülür, KAGKlar türünün en işaretsiz bir değerdir. Bununla birlikte, kesin değer, türün tam tanımına bağlıdır size_type
. Maalesef bu maksimum değerler farklıdır. Aslında, türlerin boyutu (unsigned long)-1
farklıysa (unsigned short)-
1'den farklıdır. Böylece karşılaştırma
idx == std::string::npos
idx değerine -1
ve idx'e ve string::npos
farklı türlere sahipse yanlış sonuç verebilir :
std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}
Bu hatayı önlemenin bir yolu, aramanın doğrudan başarısız olup olmadığını kontrol etmektir:
if (s.find("hi") == std::string::npos) {
...
}
Ancak, genellikle eşleşen karakter konumunun dizinine ihtiyacınız vardır. Bu nedenle, başka bir basit çözüm, npos için kendi imzalı değerinizi tanımlamaktır:
const int NPOS = -1;
Şimdi karşılaştırma biraz farklı ve daha da kullanışlı görünüyor:
if (idx == NPOS) { // works almost always
...
}
String :: npos'un değeri 18446744073709551615'tir. Dize bulunamazsa döndürülen değerdir.
18446744073709551615
64 bit için tipiktir std::size_t
, maksimum 64 bit işaretsiz değerdir.
npos, size find () 'ın hiçbir şey (muhtemelen -1 veya benzeri bir şey) bulamadığını söyleyen bir belirteç değeridir. find (), parametrenin ilk oluşumunu kontrol eder ve parametrenin başladığı dizini döndürür. Örneğin,
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");
statik sabit boyut_t npos = -1;
Size_t için maksimum değer
npos, size_t türündeki bir öğe için olası en büyük değere sahip statik bir üye sabit değeridir.
Bu değer, dizenin üye işlevlerinde bir len (veya altlen) parametresi için değer olarak kullanıldığında, "dizginin sonuna kadar" anlamına gelir.
Bir dönüş değeri olarak, genellikle eşleşme olmadığını belirtmek için kullanılır.
Bu sabit, -1 değeriyle tanımlanır, bu, size_t işaretsiz bir integral türü olduğundan, bu tür için olası en büyük gösterilebilir değerdir.
C ++ 17'nin bu günleri için bir cevap std::optional
:
Eğer bir bit ve taklit şaşı Eğer std::string::find()
bir döner std::optional<std::string::size_type>
(ki bu bir çeşit gerektiği ait ...) - o zaman durum haline gelir:
auto position = str.find(str2);
if ( position.has_value() ) {
std::cout << "first 'needle' found at: " << found.value() << std::endl;
}