Go back to Richel Bilderbeek's homepage.

Go back to Richel Bilderbeek's C++ page.

 

 

 

 

 

(C++) SeperateString

 

SeperateString is a std::string code snippet that seperates a std::string into a multiple std::strings (in a std::vector<std::string>) by a certain seperator.

 

I have multiple versions of SeperateString:

  1. Boost SeperateString #1: Seperator is a char, uses Boost String Algorithms Library
  2. STL SeperateString #2: Seperator is a char, uses algorithms, short version
  3. STLSeperateString #3: Seperator is a char, uses algorithms, long version
  4. STLSeperateString #4: Seperator is a char, does not use algorithms
  5. STLSeperateString #5: Seperator is a std::string, uses algorithms
  6. STLSeperateString #6: Seperator is a std::string, does not use algorithms

 

Of each version of SeperateString, I also wrote some test code on it.

 

 

 

 

 

Boost SeperateString #1: Seperator is a char, uses Boost String Algorithms Library

 

#include <string>
#include <vector>
#include <boost/algorithm/string/split.hpp>

//From http://www.richelbilderbeek.nl/CppSeperateString.htm
const std::vector<std::string> SeperateString(
  const std::string& input,
  const char seperator)
{
  std::vector<std::string> v;
  boost::algorithm::split(v,input,
    std::bind2nd(std::equal_to<char>(),seperator),
    boost::algorithm::token_compress_on);
  return v;
}

 

 

 

 

 

STL SeperateString #2: Seperator is a char, uses algorithms, short version

 

#include <sstream>
#include <string>
#include <vector>

//From http://www.richelbilderbeek.nl/CppSeperateString.htm
const std::vector<std::string> SeperateString(
  const std::string& input,
  const char seperator)
{
  std::istringstream is(s);
  std::vector<std::string> v;
  for (
    std::string sub;
    std::getline(is, sub, seperator);
    v.push_back(sub))
  {
    //Empty for loop
  }
  return v;
}

 

 

 

 

 

STL SeperateString #3: Seperator is a char, uses algorithms, long version

 

#include <vector>
#include <string>
#include <assert>
#include <algorithm>

//From http://www.richelbilderbeek.nl/CppSeperateString.htm
const std::vector<std::string> SeperateString(const std::string& input, const char& seperator)
{
  std::vector<std::string> v;
  typedef std::string::const_iterator Iterator;
  const Iterator end = input.end();
  Iterator i1 = input.begin();
  {
    //Copy until first comma
    Iterator i2 = std::find(i1,end,',');
    assert(i1!=i2);
    std::string s;
    std::copy(i1,i2,std::back_inserter(s));
    v.push_back(s);
    i1 = i2;
  }
  while (i1!=end)
  {
    //Copy from comma to (comma || end)
    Iterator i2 = std::find(i1 + 1,end,',');
    assert(i1!=i2);
    assert(i2 == end || *i2 == ',');
    std::string s;
    std::copy(i1+1,i2,std::back_inserter(s));
    v.push_back(s);
    i1 = i2;
  }
  return v;
}

 

 

 

 

 

STL SeperateString #4: Seperator is a char, does not use algorithms

 

#include <vector>
#include <string>
#include <assert>
#include <algorithm>

//From http://www.richelbilderbeek.nl/CppSeperateString.htm
const std::vector<std::string> SeperateString(std::string input, const char& seperator)
{
  assert(input.empty()==false);
  assert(input[0]!=seperator);
  assert(input[input.size()-1]!=seperator);

  std::vector<std::string> result;
  int pos = 0;
  while(pos<static_cast<int>(input.size()))
  {
    if (input[pos]==seperator)
    {
      const std::string found = input.substr(0,pos);
      result.push_back(found);
      input = input.substr(pos+1,input.size()-pos);
      pos = 0;
    }
    ++pos;
  }
  result.push_back(input);
  return result;
}

 

 

 

 

 

STL SeperateString #5: Seperator is a std::string, uses algorithms

 

#include <vector>
#include <string>
#include <assert>
#include <algorithm>

//From //From http://www.richelbilderbeek.nl/CppSeperateString.htm
const std::vector<std::string> SeperateString(
  const std::string& input,
  const std::string& seperator)
{
  std::vector<std::string> v;
  typedef std::string::const_iterator Iterator;
  const Iterator end = input.end();
  Iterator i1 = input.begin();
  {
    //Copy until first comma
    Iterator i2 = std::search(i1,end,seperator.begin(), seperator.end());
    assert(i1!=i2);
    std::string s;
    std::copy(i1,i2,std::back_inserter(s));
    v.push_back(s);
    i1 = i2;
  }
  while (i1!=end)
  {
    //Copy from comma to (comma || end)
    Iterator i2 = std::search(i1 + 1,end,seperator.begin(), seperator.end());
    assert(i1!=i2);
    assert(i2 == end || std::equal(seperator.begin(),seperator.end(),i2));
    std::string s;
    std::copy(i1+1,i2,std::back_inserter(s));
    v.push_back(s);
    i1 = i2;
  }
  return v;
}

 

 

 

 

 

STL SeperateString #6: Seperator is a std::string, does not use algorithms

 

#include <vector>
#include <string>
#include <assert>
#include <algorithm>

//From http://www.richelbilderbeek.nl/CppSeperateString.htm
const std::vector<std::string> SeperateStringOld(std::string input, const std::string& seperator)
{
  assert(input.empty()==false);
  assert(input.substr(0,seperator.size()) != seperator);
  assert(input.substr(input.size()-seperator.size(),seperator.size())!=seperator);
  std::vector<std::string> result;
  int pos = 0;
  while(pos<static_cast<int>(input.size()))
  {
    if (input.substr(pos,seperator.size())==seperator)
    {
      const std::string found = input.substr(0,pos);
      result.push_back(found);
      input = input.substr(pos+seperator.size(),input.size()-pos);
      pos = 0;
    }
    ++pos;
  }
  result.push_back(input);
  return result;
}

 

 

 

 

 

Go back to Richel Bilderbeek's C++ page.

Go back to Richel Bilderbeek's homepage.

 

Valid XHTML 1.0 Strict