Search code examples
c++algorithmiteratorstdvectorstdstring

Path string from std::vector`


I have a vector of char which looks something like

C:/Users/person/Desktop/Albedo.pngC:/Users/person/Desktop/Metallic.pngC:/Users/person/Desktop/Noice.pngC:/Users/person/Desktop/AO.png

How do I split the vector to individual paths? That is, I want to have

std::string path1; // = C:/Users/person/Desktop/Albedo.png;
std::string path2; // = C:/Users/person/Desktop/Metallic.png;
std::string path3; // = C:/Users/person/Desktop/Noice.png;
std::string path4; // = C:/Users/person/Desktop/AO.png;

Any idea how can I do that? Thanks in advance!


Solution

  • For example a straightforward approach provided that each path in the vector has the extension .png can look for example the following way as it is shown in the demonstrative program below.

    #include <iostream>
    #include <string>
    #include <vector>
    #include <iterator>
    #include <algorithm>
    #include <cstring>
    
    int main() 
    {
        const char *s ="C:/Users/person/Desktop/Albedo.png"
                       "C:/Users/person/Desktop/Metallic.png"
                       "C:/Users/person/Desktop/Noice.png"
                       "C:/Users/person/Desktop/AO.png";
        std::vector<char> v( s, s + std::strlen( s ) );
        
        std::vector<std::string> paths;
        const char *ext = ".png";
        size_t n = std::strlen( ext );
        
        for ( auto first = std::begin( v ), last = std::end( v ), it = first;
              ( it = std::search( first, last, ext, ext + n ) ) != last;
              first = it
            )
        {
            std::advance( it, n );
            paths.push_back( { first, it } );
        }         
        
        for ( const auto &path : paths )
        {
            std::cout << path << '\n';
        }
        
        return 0;
    }
    

    The program output is

    C:/Users/person/Desktop/Albedo.png
    C:/Users/person/Desktop/Metallic.png
    C:/Users/person/Desktop/Noice.png
    C:/Users/person/Desktop/AO.png