🧼C, C++/자료구조

문자열 자르기 < c++20 / concept / requires >

Mawile 2021. 6. 19.
728x90

 

 

 

개발환경 >> Visual Studio 2022

언어 >> C++20

운영체제 >> Windows10

 

 

 


 

 

안녕하세요!!!!!

이번에는 간단하게 어떠한 문자열객체를 받았을때

그 문자열객체를 특정조건에 따라 쪼개버리는 함수를 만들어보겠습니다!!

최근에 C++20에 새로나온 문법인 concept와 requires를 이용해서 연습하다가 만들어본거에요!!

 

#include <iostream> //std::cout
#include <vector> //std::vector
#include <string> //std::string
#include <type_traits> //SFINAE


template<class OnlyBeString>		//std::string관련 객체만 받는 템플릿
concept StringType = requires(OnlyBeString _OnlyBeString) {
	{ _OnlyBeString } -> std::convertible_to<std::string>;
	{_OnlyBeString.substr() } -> std::convertible_to<std::string>;
};

template<class OnlyBeCharacter>		//char관련 객체만 받는 템플릿
concept CharacterType = requires(OnlyBeCharacter _OnlyBeCharacter) {
	{ _OnlyBeCharacter } -> std::convertible_to<char>;
};

template<StringType StringTypeIt, CharacterType CharacterTypeIt>
std::vector<std::string> Scanner(StringTypeIt _StringTypeIt, CharacterTypeIt _CharacterTypeIt) {
	std::vector<std::string> strs;

	auto CurrentIter = _StringTypeIt.begin(); //인자로 전달받은 문자열의 첫번째 반복자주소 반환
	int CurrentIndex = 0;
	for (auto BeginIt = _StringTypeIt.begin(); BeginIt != _StringTypeIt.end(); ++BeginIt) {
		if (*BeginIt == _CharacterTypeIt) {
        //만약 두번째인자로 받은 기준과 현재 주소의 내용이같을시
			strs.push_back(_StringTypeIt.substr(CurrentIndex, std::distance(CurrentIter, BeginIt)));
            // 문자열자르고 넣기
			CurrentIndex = std::distance(_StringTypeIt.begin(), BeginIt) + 1;
            //현재 자르는 기준이되는 인덱스 거리계산
			CurrentIter = BeginIt + 1;
            //현재 자르는 기준이되는 반복자 주소계산
		}
	}

	return strs;
}

void PrintVec(std::vector<std::string> vec) { //인자로전달받은 벡터의 내용을 한줄단위로 출력
	auto BeginIt = vec.begin();
	auto EndIt = vec.end();

	while (BeginIt != EndIt) {
		std::cout << *BeginIt << "\n";

		++BeginIt;
	}
}

int main() {
	std::string str = "for i in range(3,3) ";
	PrintVec(Scanner(str, ' '));
}

 

와우~~!!!!!

Scanner함수의 두번째인자인 ' '(공백)을 기준으로 잘랐더니 저런식으로 잘 잘려서 나왔군요!!

 

궁금한 부분있으면 질문주세요!

 

 

728x90

댓글