#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <string>
#include <ostream>

struct stockTest
{
	std::string title;
	std::string getTitle() const { return title; }
	stockTest(const std::string s) : title(s) {}
	friend std::ostream& operator << (std::ostream& os, const stockTest&);
};

std::ostream& operator << (std::ostream& os, const stockTest& s)
{
	os << s.getTitle();
	return os;
}

bool Comparer(const stockTest& f1, const stockTest& f2)
{
	return f1.getTitle() < f2.getTitle();
}

using namespace std;

int main()
{
	stockTest s1[] = {stockTest("abc"), stockTest("123"), stockTest("456")};
	stockTest s2[] = {stockTest("123"), stockTest("Joe"), stockTest("789"), stockTest("456")};
	std::sort(s1, s1 + 3, Comparer);
	std::sort(s2, s2 + 4, Comparer);
	std::vector<stockTest> v_intersection;
	std::set_intersection(s1, s1 + 3, s2, s2 + 4, std::back_inserter(v_intersection), Comparer);
	cout << "The similar names are: " << endl;
	copy(v_intersection.begin(), v_intersection.end(), ostream_iterator<stockTest>(cout, "\n"));
}