본문 바로가기

C++ in Windows/STL

set 실습

<set> 실습이다. 더이상의 설명은 생략한다.

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <set>

using namespace std;


void main(void)
{
	bool flag = true;

	set<string> data;

	while(flag)
	{
		string tstr;
		cout << ">> ";
		::getline(cin, tstr);

		
		// command 
		string buf;
		stringstream ss(tstr);

		vector<string> tokens;

		// tokens 에 나눠 담기. " "을 구분자로 한다.
		while ( ss >> buf )
			tokens.push_back(buf);
			
		
		// 나눈 토큰의 양이 0보다 작으면 다시 입력을 받는다.
		if ( tokens.size() <= 0 ) continue;

		// 토큰 커맨드 명령어가 한줄이상일때.
		if ( tokens[0].length() >= 0 )
		{
			char* cmd = new char[tokens[0].length()];
			
			strcpy(cmd , tokens[0].c_str());

			if ( strcmp( cmd, "add") == 0 )	// add일 경우.
			{	
				string b;
				for( unsigned int i = 1; i < tokens.size(); i++)
				{
					b += tokens[i];

					if ( tokens.size() -1 != i )
						b += " ";
				}
				
				data.insert(b);
			}
			else if ( strcmp( cmd, "print") == 0 )
			{
				set<string> ::iterator it;

				for ( it = data.begin(); it != data.end(); it ++)
				{
					cout << *it << endl;
				}
			}
			else if ( strcmp ( cmd, "del") == 0 )
			{
				set<string> ::iterator it;
				
				string f;
				for( unsigned int i = 1; i < tokens.size(); i++)
				{
					// 문자열을 토큰으로 나누다보니. 
					// 문자사이의 공백을 무시해서 공백 추가.
					f += tokens[i];

					if ( tokens.size() -1 != i )
						f += " ";
				}

				// set에서 erase(데이터)를 하면, 
				// 해당 데이터를 알아서 찾아서 지운다.
				data.erase(f);

				/*
				//// 이것도 동작은 한다. ////
				it = data.find(f);

				if ( it != data.end() )
				{
					data.erase(it);
				}
				*/
			}
			else if ( strcmp ( cmd, "end" ) == 0 )
			{
				flag = false;
			}
			else if ( strcmp ( cmd, "/?") == 0 || strcmp ( cmd, "help") == 0 )
			{
				cout << "add {string} = 문자열 저장" << endl;
				cout << "del {string} = 저장된 문자열 삭제" << endl;
				cout << "print = 데이터 출력" << endl;
				cout << "end = 프로그램 종료" << endl;
			}
			

		}
		
	}
}



'C++ in Windows > STL' 카테고리의 다른 글

set 실습 2  (0) 2012.07.09
vector 실습  (0) 2012.07.04