2012-05-12 20 views
14

Por ejemplo, supongamos que tengo std::string que contiene ruta de tipo UNIX a algún archivo:manera eficiente para truncar la cadena de longitud N

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

Supongamos ahora quiero tirar la información de archivos relacionados y obtener la ruta a ' blah 'carpeta de esta cadena. Entonces, ¿hay una forma eficiente (diciendo 'eficiente' quiero decir 'sin copias') de truncar esta cadena para que solo contenga "/first/second/blah"?

Gracias de antemano.

Respuesta

30

Si se conoce N, puede utilizar

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

Si N no se conoce y que desea encontrarlo, puede utilizar cualquiera de las funciones de búsqueda. En este caso, usted querrá encontrar la última barra, para que pueda utilizar rfind o find_last_of:

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

Incluso hay una variación de esta basado en iteradores:

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

Dicho esto, si van a estar manipulando caminos para ganarse la vida, es mejor usar una biblioteca diseñada para esta tarea, como Boost Filesystem.

+0

¡Exactamente lo que quería! Sabía que debía haber una "hermosa" forma de hacerlo :) Gracias. – tonytony

+0

O muchas maneras hermosas :) – chris

+0

Edité la respuesta, std :: string :: npos en lugar de std :: npos. npos es un miembro de std :: string not std –

Cuestiones relacionadas