#include <vector>
#include <string>
#include <sstream>
#include <iostream>
using namespace std;

int ConvertString2Int(const string& str)
{
	stringstream ss(str);
	int x;
	if (! (ss >> x))
	{
		cerr << "Error converting " << str << " to integer" << endl;
		abort();
	}
	return x;
}

vector<string> SplitStringToArray(const string& str, char splitter)
{
	vector<string> tokens;
	stringstream ss(str);
	string temp;
	while (getline(ss, temp, splitter)) // split into new "lines" based on character
	{
		tokens.push_back(temp);
	}
	return tokens;
}

vector<int> ParseData(const string& data)
{
	vector<string> tokens = SplitStringToArray(data, ',');

	vector<int> result;
	for (vector<string>::const_iterator it = tokens.begin(), end_it = tokens.end(); it != end_it; ++it)
	{
		const string& token = *it;
		vector<string> range = SplitStringToArray(token, '-');
		if (range.size() == 1)
		{
			result.push_back(ConvertString2Int(range[0]));
		}
		else if (range.size() == 2)
		{
			int start = ConvertString2Int(range[0]);
			int stop = ConvertString2Int(range[1]);
			for (int i = start; i <= stop; i++)
			{
				result.push_back(i);
			}
		}
		else
		{
			cerr << "Error parsing token " << token << endl;
			abort();
		}
	}
	
	return result;
}

int main()
{
	vector<int> result = ParseData("1-5,10,12,15-16,25-35,67,69,99-105");
	for (vector<int>::const_iterator it = result.begin(), end_it = result.end(); it != end_it; ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
}

