Advertisement
Death420

C++ string split

May 14th, 2024 (edited)
681
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <sstream>
  5. std::vector<std::string> str_split(const std::string& str, const std::string& whitespace = " \n\r\t", const uint32_t maxSplit = -1)
  6. {
  7.     constexpr auto npos = std::string::npos;
  8.  
  9.     std::vector<std::string> vec;
  10.     size_t i = 0;
  11.     size_t amountSplit = 0;
  12.     while (i != npos)
  13.     {
  14.         if (maxSplit != -1 && ++amountSplit > maxSplit)
  15.         {
  16.             i = str.find_first_not_of(whitespace, i);
  17.             vec.emplace_back(str.data() + i, str.size() - i);
  18.             return vec;
  19.         }
  20.  
  21.         i = str.find_first_not_of(whitespace, i);
  22.  
  23.         if (i == npos)
  24.             return vec;
  25.  
  26.         size_t endIdx = str.find_first_of(whitespace, i + 1);
  27.  
  28.         vec.emplace_back(str.data() + i,
  29.                                         (endIdx == npos ? str.size() : endIdx) - i);
  30.         i = endIdx;
  31.     }
  32.     return vec;
  33. }
  34. std::vector<std::string_view> str_split_sv(std::string_view str, std::string_view whitespace = " \n\r\t", const uint32_t maxSplit = -1)
  35. {
  36.     constexpr auto npos = std::string_view::npos;
  37.  
  38.     std::vector<std::string_view> vec;
  39.     size_t i = 0;
  40.     size_t amountSplit = 0;
  41.     while (i != npos)
  42.     {
  43.         if (maxSplit != -1 && ++amountSplit > maxSplit)
  44.         {
  45.             i = str.find_first_not_of(whitespace, i);
  46.             vec.emplace_back(str.data() + i, str.size() - i);
  47.             return vec;
  48.         }
  49.  
  50.         i = str.find_first_not_of(whitespace, i);
  51.  
  52.         if (i == npos)
  53.             return vec;
  54.  
  55.         size_t endIdx = str.find_first_of(whitespace, i + 1);
  56.  
  57.         vec.emplace_back(str.data() + i,
  58.                                         (endIdx == npos ? str.size() : endIdx) - i);
  59.         i = endIdx;
  60.     }
  61.     return vec;
  62. }
  63. std::vector<std::string> sstr_split(const std::string& input, const char delim = ' ')
  64. {
  65.     std::stringstream stream{input};
  66.     std::vector<std::string> result;
  67.     for(std::string str; std::getline(stream, str, delim);)
  68.         result.push_back(std::move(str));
  69.     return result;
  70. }
  71. int main()
  72. {
  73.     std::string str = "This is  a test";
  74.     auto vec = str_split_sv(str);
  75.    
  76.     std::cout << '"' << str << "\" (" << str.size() << " chars)\n" << vec.size() << " substrings:\n";
  77.    
  78.     for(size_t i = 0, len = vec.size(); i < len; ++i)
  79.         std::cout << i << " - [" << vec[i] << "]\n";
  80.    
  81.     std::cout << "\nEnd of program.";
  82. }
  83.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement