Что означает * - end () в C ++? - PullRequest
2 голосов
/ 18 октября 2019

Глядя на эту страницу cppreference.com для std::filesystem::path::filename, описание метода буквально просто "эквивалентно relative_path().empty() ? path() : *--end()". Я никогда не видел этот синтаксис "* - end ()". Я могу понять, что это делает из контекста, но что это значит точно? И можно ли использовать его в другом контексте для извлечения, скажем, подстроки?

1 Ответ

2 голосов
/ 18 октября 2019

Сначала давайте посмотрим на std::filesystem::path::begin()/end(). Это позволяет вам перебирать путь по одному каталогу за раз, поэтому для /user/kenyn/foo.bar с этим кодом:

fs::path p = "/user/kenyn/foo.bar";
for(auto &e : p)
    std::cout << e << '\n';

Мы увидим:

user
kenyn
foo.bar

Итак, что такое *(--(p.end()))? Я добавил дополнительные скобки, чтобы мы могли видеть, что мы получаем итератор, указывающий на один после последнего элемента с помощью p.end(), перемещаем назад на один с помощью --, чтобы получить ссылку на foo.bar, затем разыменовываем итератор с помощью * чтобы дать нам указатель на последний элемент пути "foo.bar".

Полное выражение, затем:

relative_path().empty() ? path() : *--end()

Говорит, что нет относительного пути (т. е. только имя файлаили вообще ничего), верните все целиком, иначе, если есть относительный путь, верните последний элемент списка путей, который будет именем файла.

...