🧼C, C++/자료구조
문자열 자르기 < c++20 / concept / requires >
개발환경 >> 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함수의 두번째인자인 ' '(공백)을 기준으로 잘랐더니 저런식으로 잘 잘려서 나왔군요!!
궁금한 부분있으면 질문주세요!
'🧼C, C++ > 자료구조' 카테고리의 다른 글
자료구조 만들기 [Dictionary] C++ (0) | 2021.01.19 |
---|---|
#예고편# 자료구조 만들기 C++ [Dictionary] (0) | 2021.01.18 |
자료구조 만들기 [Vector] C++ (0) | 2020.11.08 |
댓글