2012-05-12 4 views
14

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

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

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

Заранее спасибо.

ответ

30

Если 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.

+0

Именно то, что я хотел! Я знал, что должен быть такой способ, как это сделать :) Спасибо. – tonytony

+0

Или много красивых путей :) – chris

+0

Я отредактировал ответ, std :: string :: npos вместо std :: npos. npos является членом std :: string not std –