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

std::vector<std::string> SplitInputString(const std::string& input)
{
	std::vector<std::string> tokens;
	
	std::istringstream ss(input);
	std::copy(std::istream_iterator<std::string>(ss), 
			  std::istream_iterator<std::string>(), 
			  std::back_inserter(tokens));
			  
	return tokens;
}

struct ParsedInputData
{
	ParsedInputData(const std::string& command, const std::vector<std::string>& variables)
	: command(command)
	, variables(variables)
	{
		
	}
	
	std::string command;
	std::vector<std::string> variables;
};

int main(int argc, const char* argv[]) 
{
	std::vector<std::string> testInputs {"add A B", "add B F", "breadth F", "subtract A B"};
	
	std::vector<ParsedInputData> parsedInputDatas;
	
	for (const auto& input : testInputs)
	{
		const auto& tokens = SplitInputString(input);
		auto parsedInputData = ParsedInputData(tokens.front(), std::vector<std::string>(tokens.begin() + 1, tokens.end()));
		parsedInputDatas.push_back(parsedInputData);
	}
	
	for (const auto& parsedInputData : parsedInputDatas)
	{
		std::cout << "Command is: " << parsedInputData.command << std::endl;
		std::cout << "Variables: ";
		for(const auto& variable : parsedInputData.variables)
		{
			std::cout << variable << " ";
		}
		
		std::cout << std::endl;
	}
	
	return 0;
}