String :: npos bu kodda ne anlama geliyor?


97

std::string::nposAş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:


110

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.


3
== -1'i karşılaştırmak, bazı kişilerin bunu <0'a dönüştürebileceklerini düşünmelerine neden olabilir ki bu aynı şey DEĞİLDİR ve çalışmayacaktır.
Andy Dent

Merak ediyorum, buna birileri rastladı mı yoksa sadece ben mi ... Windows'ta çalıştırdığımda koşarım cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;ve pos:4294967295 npos: 4294967295Mac'te alırım pos:4294967295 npos: 18446744073709551615. Doğru görünmüyor Yani ... Ben karşılaştırarak öneririz iyi bir yolu -1yerinestd::string::npos
user1135469

@ user1135469 codaddict feryat ( stackoverflow.com/a/3827997/752842 ) veya Sebastian Raschka'nın cevabını görürseniz, aldığınız şeyin mantıklı olacağını düşünüyorum. Ve npos kullanmanızı tavsiye ederim çünkü -1 kullanmayı denedim ve kullandığım şartlar altında düzgün çalışmıyordu.
Dzyann

51

string::npossabit (muhtemelen -1) olmayan bir konumu temsil eder. findKalıp bulunamadığında yöntemle döndürülür .


15
Aslında hatırlamayı kolaylaştıran npos = no-pos türevini göstermek için +1. O kadar açık ki, bir kez bildikten sonra bunu düşünmeyeceksiniz, ama bu harfleri ilk kez gören biri tıklamayabilir ...?
Tony Delroy

4
47 seviyede yanlış ... npos size_t değerindedir, negatif olamaz ... gerçek anlamı max_index, 18446744073709551615, 64 bit size_t
NoSenseEtAl

25

İçin belge string::nposdiyor 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.


17

size_tiş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


size_t, 32 bit derleyici için işaretsiz int'dir; 64 bit derleyici için unsigned long long int .. -1 olarak ayarlandığında o işaretsiz tipin maksimum değerine sahip olur.
sudheerbb

9

std::string::nposher zaman herhangi bir std::stringörneğin sınırları dışında olan uygulama tanımlı dizindir . Çeşitli std::stringiş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.


4

string::size_typebul işlevinin dönüş türü için kullanmamız gerekir, aksi takdirde ile karşılaştırma string::nposçalışmayabilir. size_typedizenin 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_tolarak kullanır size_type. Çünkü -1iş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)-1farklıysa (unsigned short)-1'den farklıdır. Böylece karşılaştırma

idx == std::string::npos

idx değerine -1ve idx'e ve string::nposfarklı 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
...
}

3

foundnposarama dizesinde alt dizeyi bulamama durumunda olacaktır .


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

Hatayı / bulunamadı vb. Gösteren dize işlevleri tarafından döndürülür.


1

String :: npos'un değeri 18446744073709551615'tir. Dize bulunamazsa döndürülen değerdir.


1
Gerçek değer, uygulama tanımlıdır ve ilgisizdir. Ancak pratikte değer 1844674407370955161564 bit için tipiktir std::size_t, maksimum 64 bit işaretsiz değerdir.
Alex Guteniev

0

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

Bu kod "asad.other" için wort olmayacaktır çünkü find () bir int döndürmez.
LogicMagic

0

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.


0

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.