#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
  // Begin and end iterators in STL:
  {
    std::vector<int> v1(4,5);
    auto i  = std::find(v1.begin(), v1.end(), 3);  // i is vector::iterator

    const std::vector<int> v2(4,5);
    auto j = std::find(v2.begin(), v2.end(), 3);   // j is vector::const_iterator

    std::vector<int> v3(4,5);
    auto k = std::find(v3.cbegin(), v3.cend(), 3); // k is vector::const_iterator (since C++11)
  }

  // Issue in C++98:
  {
    std::vector<int> v(3,5);
    std::vector<int>::const_iterator ci = std::find( v.begin(), v.end(), 3);  // implicit casting
    v.insert(ci, 2);  // syntax error in C++98, not in C++11 (since g++ 4.9.2)
  }

  // C++11: use global begin() and end() for greater generality
  {
    std::vector<int> v1(4,5);
	auto i = std::find(begin(v1), end(v1), 3);         // i is vector::iterator
	
	const std::vector<int> v2(4,5);
	auto j = std::find(begin(v2), end(v2), 3);         // j is vector::const_iterator
	
	std::vector<int> v3(4,5);
	auto k = std::find(cbegin(v3), cend(v3), 3);       // not in C++11, only since C++14
	
	int t[4] = { 1, 2, 3, 4 };
	auto l = std::find(std::begin(t), std::end(t), 3); // l is int*
  }
}