Go back to Richel Bilderbeek's homepage.

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

 

 

 

 

 

(C++) std::search

 

std::search is an STL algorithm for searching a sequence of elements in containers. It is similar to std::find, except that std::find searches for a single element.

 

 

 

 

 

Example

 

Assume you work with a std::vector of integers in which two sequences are forbidden: zero-zero and one-zero. With std::search these sequences can be used to find if our exemplary std::vector is valid.

 

#include <algorithm>
#include <cassert>
#include <vector>

int main()
{
  std::vector<int> v;
  v.push_back(0);
  v.push_back(1);
  v.push_back(0);
  v.push_back(0);
  v.push_back(2);
  v.push_back(0);

  //Two consequtive zeroes are forbidden
  std::vector<int> f1;
  f1.push_back(0);
  f1.push_back(0);

  //A one followed by a two is forbidden
  std::vector<int> f2;
  f2.push_back(1);
  f2.push_back(2);

  assert(std::search(v.begin(),v.end(),f1.begin(),f1.end())
    != v.end()
    && "Assume forbidden sequence 1 is detected");

  assert(std::search(v.begin(),v.end(),f2.begin(),f2.end())
    == v.end()
    && "Assume forbidden sequence 2 is not present");
}

 

 

 

 

 

Example: SeperateString

 

#include <vector>
#include <string>
#include <cassert>
#include <algorithm>

//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;
}

 

 

 

 

 

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

Go back to Richel Bilderbeek's homepage.

 

Valid XHTML 1.0 Strict