C ++ Strings: size_t и string :: npos - PullRequest
       7

C ++ Strings: size_t и string :: npos

1 голос
/ 03 февраля 2020

Я начинающий программист, и я пытаюсь понять этот кусок, если код и как он работает ...

Так вот код:

#include <iostream>
#include <string>  //C++ Strings Library
using namespace std;

int main() {
  string s1 {};
  string wordFind {};
  s1 = "The secret word is Boo";
    cout << "Enter the word to find: ";
    cin >> wordFind;
    size_t position = s1.find(wordFind);
     if (position != string::npos)
        cout << "Found " << wordFind << " at position: " << position << endl;
     else
        cout << "Sorry! " << wordFind << " not found" << endl;
    return 0;
}

Это вопросы, которые у меня действительно есть:

  1. Что такое size_t и когда мы должны их точно использовать? (Все, что я знаю, это то, что мы должны использовать их для индексации массивов и подсчета l oop)
  2. Почему мы использовали size_t здесь? не может ли быть так?
  3. Что такое позиция? (Я имею в виду, она составлена ​​или является частью C ++?)
  4. Означает ли условие if поиск слова до конца строки?

Редактировать: Спасибо всем за помощь ... Я ценю это:)

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Что такое size_t и когда мы должны их точно использовать? (Все, что я знаю, это то, что мы должны использовать их для индексации массивов и подсчета l oop)

size_t - это целочисленный тип без знака, достаточно большой, чтобы представить размер любого объекта в C ++, включая типы массивов. (размер соответствует тому, сколько памяти он занимает в байтах).

Почему мы использовали size_t здесь?

Поскольку он, как правило, достаточно велик, и использования чего-то вроде int будет недостаточно, если строка больше максимального числа, которое может хранить int. Педантично, вы должны были использовать std::string::size_type, который гарантированно способен удерживать размер std::string, независимо от его размера.

не может ли это быть так ?: position = s1.find(wordFind);

Нет, вы должны указать тип position. В качестве альтернативы вы можете использовать auto: auto position = s1.find(wordFind);

Что такое позиция? (Я имею в виду, она состоит из C ++?) Просто переменная, представляющая индекс подстроки (слова), которую вы ищете.

Означает ли условие if поиск слова до конца строки?

Проверяется, найдено ли слово. std::string::npos - это специальное число std::string::find возвращается, когда искомая подстрока не найдена.

1 голос
/ 03 февраля 2020

Давайте начнем с того, что ИМХО, std::string является своего рода дизайном класса с хромой строкой или, по крайней мере, определенно показывает его возраст несколькими способами.

  1. Что такое size_t и когда мы должны использовать это точно?

Это равно std::size_t (в C ++ это , а не просто size_t). Но давайте не будем говорить о том, когда именно, когда вы должны его использовать, потому что ...

Почему мы использовали size_t здесь?

Я бы сказал, что мы не должны иметь. Мы должны были либо написать

auto position = s1.find(wordFind);

(как вы на самом деле предложили, но с auto для обозначения автоматического вывода типа c), либо, если мы хотим быть явным, то:

std::string::size_type position = s1.find(wordFind);

Потому что это то, что find() возвращает. Часто бывает , чтобы быть std::size_t, но: (a) Возможно, нет, я даже не уверен (спасибо @Ayxan); (б) вас не должно волновать, обычно это std::size_t или нет.

Но даже вышеприведенные варианты не верны. Здесь есть более глубокая проблема - и проблема в том, что find() должен действительно возвращать [std::optional][2]<std::string::size_type>. За исключением того, что в C ++ до недавнего времени не было необязательного типа, так что строковый класс как бы его настраивал. Ошибка при поиске подстроки возвращает значение, выделенное как недопустимое: std::string::npos (имеет тип std::string::size_type). Так что, возможно, то, что мы должны написали:

auto to_optional = [](std::string::size_type pos_or_npos) { 
   return pos_or_npos == std::string::npos ? 
       std::nullopt : 
       std::optional<std::string::size_type>{pos_or_npos};
};
auto position = to_optional(s1.find(wordFind));

Что больше похоже на то, что мы на самом деле имеем в виду: либо вы получили какую-то позицию, либо нет.

Что такое позиция? (Я имею в виду, она составлена ​​или является частью C ++?)

См. Мой последний абзац.

Означает ли условие if поиск слова до конца строки?

Нет, find() уже ищет до конца. С нашей переделкой if() будет выглядеть так:

if (position.has_value()) 
// ... etc etc
else
// ... etc etc
...