Эффективный способ обрезания строки по длине N

Например, предположим, что у меня есть std::string, содержащий путь в стиле UNIX к некоторому файлу:

string path("/first/second/blah/myfile");

Предположим теперь, что я хочу выбросить информацию, связанную с файлами, и получить путь к папке "blah" из этой строки. Итак, эффективный (говорящий "эффективный" я имею в виду "без каких-либо копий" ) способ обрезания этой строки, чтобы он содержал только "/first/second/blah"?

Спасибо заранее.

Ответы

Ответ 1

Если N известно, вы можете использовать

path.erase(N, std::string::npos);

Если N неизвестно и вы хотите его найти, вы можете использовать любую из функций поиска. В этом случае вы хотите найти последнюю косую черту, чтобы вы могли использовать rfind или find_last_of:

path.erase(path.rfind('/'), std::string::npos);
path.erase(path.find_last_of('/'), std::string::npos);

Там даже вариация на основе итераторов:

path.erase (path.begin() + path.rfind('/'), path.end());

Тем не менее, если вы собираетесь манипулировать путями для жизни, лучше использовать библиотеку, предназначенную для этой задачи, такую ​​как Boost Filesystem.