๋๋ฌด ๋ฐ๋น ์ ๊ธด ํฌ์คํ ๊ธ์ ๋ง๋ฌด๋ฆฌ๋ฅผ ๋ชปํ๊ณ ์๋ค..
์ผ๋จ ๊ฐ๋ฒผ์ด๊ฑฐ๋ผ๋ ์ฌ๋ ค์ผ ๋ค ์ต์ธํ ๊ฒ ๊ฐ๋ค
1. std::transform ์ฌ์ฉ
2. std::toupper & std::tolower ์ฌ์ฉ
3. boost::to_upper ์ to_lower ์ฌ์ฉ
1. std::transform
๊ตฌ๊ธ์ "C++ ๋์๋ฌธ์ ๋ณํ" ์ด๋ผ๊ณ ๊ฒ์ํ๋ฉด
์๋ง ๊ฐ์ฅ ๋จผ์ ๋ณด์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด์ง ์์๊น ์ถ๋ค
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ณด๊ธฐ์ ์ cppreference์ ์๋ ํจ์ ํํ๋ฅผ ๋จผ์ ๋ณด๊ฒ ๋ค
* ํค๋
#include <algorithm>
ํค๋๋ ์๋ ๊ณ ,,
* ํจ์ ์ํ(?)
template< class InputIt, class OutputIt, class UnaryOperation >
OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first,
UnaryOperation unary_op );
..? ๋ณต์กํ๊ฒ ์๊ฒผ์ง๋ง, transform ๋ป ์์ฒด๊ฐ "๋ณํ"์ด์ง ์์๊ฐ
Input ์ ํ ๋ฌด์ธ๊ฐ๋ฅผ ์ํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ Output ์ผ๋ก ๋ฐ๊พธ๊ฒ ๋ค ์๋ฐ ๋ป์ด๋ผ๊ณ ์์์ด ๋๋ค
์ํ๋ ๋ฐฉ๋ฒ์ด ์ฐ๋ฆฌ๋ ๋/์๋ฌธ์ ๋ณํ์ผํ ๊ณ ใ
transform ํจ์๋ฅผ ์ข๋ ์ฌ์ด ๋ชจ์์ผ๋ก ๋ณด์๋ฉด,
Output transform(
/*1*/ ์
๋ ฅํ ๋ณ์์ first ์์น,
/*2*/ ์
๋ ฅํ ๋ณ์์ last ์์น๊น์ง,
/*3*/ ์ ์ฅํ ๋ณ์์ first ์์น,
/*4*/ ๋ณํํ ๋ฐฉ๋ฒ์ด ์๋ ํจ์
);
์ด๋ ๊ฒ ์๊ธฐํ ์ ์์ ๊ฒ ๊ฐ๋น
์๋ฅผ ๋ค์ด์, "tistory"๋ผ๋ ๊ธ์๋ฅผ ๋๋ฌธ์๋ก ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด?
#include <algorithm>
#include <string>
using namespace std;
int main(int argc, char **argv)
{
string str = "Tistory";
transform(str.begin(), str.end(), str.begin(), ::toupper);
cout << str << endl; /* Return: TISTORY */
return 0;
}
cf) std::toupper & std::tolower
transform ํจ์ ๋ง์ง๋ง ํ๋ผ๋ฏธํฐ์ std::toupper๋ std::transfrom() ์ฒ๋ผ std์์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค
- std::toupper : ๋๋ฌธ์๋ก ๋ณํํ๋ ํจ์
- std::tolower : ์๋ฌธ์๋ก ๋ณํํ๋ ํจ์
์์ฑํ๋ ค๊ณ ๋ณด๋ toupper์ tolower๋ ์ถ๊ฐํด์ผ๊ฒ ์ (์๋ ์ฐธ๊ณ )
std::์์ ์ ๊ณตํ๋ ํจ์๋ฅผ ์ฌ์ฉํ ์๋ ์๊ณ , ์๋ก ์ ์ํ ํจ์๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค
์๋ฅผ ๋ค์ด, vector ์์ ์๋ ์์์ 1์ฉ ๋ํ๋ ค๋ฉด, 1์ฉ ๋ํ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ฃผ๋ฉด ๋๋ค
* ์์
#include <algorithm>
#include <string>
using namespace std;
int plusFunc(int num)
{
return num + 1;
}
void printVec(vector<int> vec)
{
for( int i=0; i < (int)vec.size(); i++)
cout << i << ": "<< vec[i] << endl;
return;
}
int main(int argc, char **argv)
{
vector<int> input {1, 2, 3};
vector<int> output(3);
printVec(input);
transform(input.begin(), input.end(), output.begin(), plusFunc);
printVec(output);
return 0;
}
* iterator ์ฌ์ฉ
transform()์ ์กฐ๊ธ๋ง ๊ตฌ๊ธ๋งํ๋ฉด ๋์ค๋ ์์๋ ๋ณดํต string/vector ์ผ ๊ฒ์ด๋ค
Iterator๋ฅผ ๊ฐ์ง๋ input๊ณผ output์ ์ฌ์ฉํด์ผํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํด๋์
2. std::toupper & std::tolower ์ฌ์ฉ
(1) std::toupper
๋ฌธ๋ transform()์ toupper()๋ฅผ ์ฌ์ฉํ๋ค๊ฐ ๋ ์๊ฐ์ด,
toupper()๋ ์ ๋ชฐ๋ผ์ ์ฅ ๊ทธ๋ฅ ๋ฐ๋ก toupper๋ฅผ ์ฐ๋ฉด ๋๋๊ฑฐ ์๋๊ฐ? ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค
์ด์ ๋ → ํ ๊ธ์๋ง ๋ฐ๊ฟ ์ ์๊ธฐ ๋๋ฌธ ใ ๊ทธ๋์ ๋ฌธ์์ด์ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด
transform์ด๋ ์จ์ผํ๋๊ฑฐ์์ ใ ์ ใ
* ํจ์ ์ํ
#include <cctype>
int toupper ( int ch ) ;
- parameter: ๋ณดํต unsigned char ํ์ ์ ๋ฌธ์์ด์ ๋ง์ด ์๋๋ค
- return value: ๋๋ฌธ์๋ก ๋ฐ๋ ๊ฒฐ๊ณผ ๊ฐ
* ์์
using namespace std;
int main(int argc, char **argv)
{
unsigned char c = 't';
auto ret = std::toupper(c);
cout << static_cast<char>(ret) << endl; /* Return: T */
return 0;
}
(2) std::tolower
toupper์ ๋ฐ๋๋ก ์๋ฌธ์๋ก ๋ณํํด์ค๋ค
์ค๋ช ์ ํจ์ฐํ๊ณ ํจ์ ์ํ๋ง ์์๋ง ๋ค๋ฃจ๊ฒ ๋ค
* ํจ์ ์ํ
#include <cctype>
int tolower( int ch )
* ์์
using namespace std;
int main(int argc, char **argv)
{
unsigned char c = 'B';
auto ret = std::toupper(c);
cout << static_cast<char>(ret) << endl; /* Return: b */
return 0;
}
3. boost::to_upper ์ to_lower ์ฌ์ฉ (+ boost::to_upper_copy)
boost์์๋ std::transform + std::toupper ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํจ์๊ฐ ์๋ค
๋๋ ๋ถ์คํธ๋ฅผ ์ข์ํ๋๊น,, ์์ผ๋ก ์ด๊ฑธ ๋ง์ด ์ฐ๋ ค๊ณ ํ๋ค
* ํจ์ ์ํ
#include <boost/algorithm/string.hpp>
template<typename WritableRangeT>
void to_upper(WritableRangeT & Input,
const std::locale & Loc = std::locale());
๋ด๊ฐ boost::to_upper๋ฅผ ์ ํธํ๋ ์ด์ ๋ ํ๋ผ๋ฏธํฐ ๋๋ฌธ์ด๋ค
์์๋ก ๋ฐ๋ก ์ค๋ช ํ์๋ฉด,
* ใ ใ
int
main(int argc, char **argv)
{
string str = "tistory_mutpp";
string str2 = "tistory_mutpp";
string str3 = "tistory_mutpp";
string ret;
transform(str.begin(), str.end(), str.begin(), (int(*)(int))toupper);
cout << str << endl; /* Return: TISTORY_MUTPP */
transform(str2.begin(), str2.end(), str2.begin(), ::toupper);
cout << str2 << endl; /* Return: TISTORY_MUTPP */
boost::to_upper(str3);
cout << str3 << endl; /* Return: TISTORY_MUTPP */
return 0;
}
boost::to_upper(๋ฐ๊ฟ ๋ฌธ์์ด);
๋ฐ๊พธ๊ณ ์ถ์ ๋ฌธ์์ด์ ๋ฃ๊ธฐ๋ง ํ๋ฉด ๋๋๊ฑฐ๋ค ใ
๊ทผ๋ฐ ๋ฐ๊ฟ ๋ฌธ์์ด์ ๊ฐ์ ๋ณ์์ ๋ฐ๊ฟ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ํ์ด ๋ฐ๋๋ค
(return type ๋ํ void)
์น์ ํ ๋ถ์คํธ์จ๋ ๊ทธ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ณต์ฌํด์ ์ฃผ๋ ํจ์๋ ์ ๊ณตํด์ค๋ค → boost::to_upper_copy
* boost::to_upper_copy
template<typename OutputIteratorT, typename RangeT>
OutputIteratorT
to_upper_copy(OutputIteratorT Output, const RangeT & Input,
const std::locale & Loc = std::locale());
template<typename SequenceT>
SequenceT to_upper_copy(const SequenceT & Input,
const std::locale & Loc = std::locale());
๋ถ์คํธ์จ: Each element of the input sequence is converted to upper case. The result is a copy of the input converted to upper case. It is returned as a sequence or copied to the output iterator
์์๋ง ๋ค์ด์ ์ค๋ช ์ ๋๋ด๊ฒ ๋ค
int
main(int argc, char **argv)
{
string str = "tistory_mutpp";
cout << str << endl; /* Return: tistory_mutpp */
string ret = boost::to_upper_copy(str);
cout << str << endl; /* Return: tistory_mutpp */
cout << ret << endl; /* Return: TISTORY_MUTPP */
return 0;
}
* cppreference
en.cppreference.com/w/cpp/algorithm/transform
* boost
www.boost.org/doc/libs/1_41_0/doc/html/boost/algorithm/to_upper.html
* boost to_upper_copy
www.boost.org/doc/libs/1_54_0/doc/html/boost/algorithm/to_upper_copy.html
'๐ C๋ C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Boost Asio์ ๋ํด์ ์์๋ณด์ (4) | 2021.05.20 |
---|---|
C++ ํด๋์ค ๋ฉค๋ฒ๋ณ์ ์ด๊ธฐํ๋ฅผ ์์๋ณด์ (4) | 2021.03.25 |
C++ Function Object (ํจ์ ๊ฐ์ฒด)๋ฅผ ์์๋ณด์ (4) | 2021.01.22 |
C++ std::map์ ์ฌ์ฉํด๋ณด์ (4) | 2021.01.07 |
C++ ์ ์ญ ๋ณ์์ ์ ์ ๋ณ์๋ฅผ ์์๋ณด์ (0) | 2021.01.04 |