불필요한 부분을 잘라낼 때 trim을 하기 때문에 함수 이름을 trim이라고 합니다.
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cctype>
#include <algorithm>
using namespace std;
int main()
{
ifstream infile("input35.txt");
string str;
vector<string> words;
while (infile >> str)
{
str = trim(str);
if (str.length() > 0);
{
tolowercase(str);
auto it = find(words.begin(), words.end(), str);
if (it == words.end());
words.push_back(str);
}
}
infile.close();
for (auto s : words)
cout << s << endl;
return 0;
}
string trim(string str)
{
int s = 0, t = str.length() - 1;
while (s < str.length() && !isalnum(str[s]))
s++;
while (t >= 0 && !isalnum(str[t]))
t--;
if (s <= t)
return str.substr(s, t - s + 1);
else
return "";
}
void tolowercase(string str)
{
for (int i = 0; i < str.length(); i++)
str[i] = tolower(str[i]);
}
void tolowercase(string str)
{
for (int i = 0; i < str.length(); i++)
str[i] = tolower(str[i]);
}
이거 같은 경우 복사된 문자열에 하는 것이기 때문에 원래 문자에는 아무 영향을 주지 못합니다. 이럴 때 하는 방법은 trim(str);에서 문자를 받아서 trim하고 끝낸 것이 아니라 그 trim을 return을 해주었습니다.그래서 이런 경우에도 string을 써준 다음에 return str; 이런 식으로 해준다면 가능합니다.
string tolowercase(string str)
{
for (int i = 0; i < str.length(); i++)
str[i] = tolower(str[i]);
return str;
}
이렇게 바꿔준 다음에 str = tolowercase(str); 이런 식으로 바꿔준다면 정상적으로 대문자가 소문자로 바뀌어서 나오는 것을 보실 수 있습니다.
참조에 의한 호출
c++에만 있는 참조에 의한 호출에 대해 설명하겠습니다.
c++에서 변수의 타입은 3가지로 분류가 됩니다.
- 빌트인(built-in) 타입( 언어에서 제공되는 것) int, float, double, signed, unsigned...
- 유도된(derived) 타입 혹은 복합(compound, composite) 타입 (배열, 참조, 포인터, 함수)
- 사용자 정의(user-defined) 타입 struct와 class
참조
int a = 10;
int &b = a;
a = 8
cout << b; // will print 8
vector<int> v = {1, 2, 3, 4};
vector<int> &w = v;
vector<int> &u // error
&b가 참조변수가 되는데요. 이렇게 되면 변수 a하고 b하고 같은 변수가 되는 것입니다. 한 사람이 이름을 두개를 가지고 있는 경우라고 생각하면 됩니다. a를 가지고 할 수 있는 모든 일을 b가 할 수 있으며 a를 바꾸면 b도 바뀝니다.
그리고 참조변수는 항상 어떤 변수가 있는 것에 넣어야 하는 것입니다. 어떠한 변수에 하는 것이지 어떠한 값이 없는 것에 참조변수를 쓸 수는 없는 것입니다. 선언할 때 그 변수의 의미를 &를 붙이면 참조변수라는 것입니다.]
밑에 v와 w의 사례도 같습니다. 저렇게 w를 선언할 때 참조인 &를 쓰면서 하면 v와 w는 하나의 값이 되면서 두 개의 이름을 사용한다고 보면 됩니다. 밑에 &u같은 것은 에러입니다. 참조변수를 할 때는 = 변수 값이 항상 필요합니다.
swap(data[j], data[j+1]);
void swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
이렇게 해주는 것입니다. 이렇게 될 경우 a와 b는 data[j] 와 data[j+1]도 swap이 되고 우리가 의도했던 대로 정렬이 되는 것입니다.
참조에 의한 호출같은 경우 참조를 하지 않는 것과 달리 함수에서 대량의 데이터가 복사되는 일을 피할 수 있으므로 훨씬 효율적이라고 할 수 있습니다. c++에서 참조에 의한 호출은 굉장히 광범위하게 사용이 됩니다.
- 호출된 함수에서 무언가를 직접적으로 조사를 하고싶을 때 (변경을 하고 그 호출의 결과가 다른 곳에 반영되길 원할 때)
- 내가 매개변수로 넘겨줄 데이터가 벡터와 같은 덩치가 큰 데이터일 때, 데이터를 통째로 복제할 필요가 없는 것
참조에 의한 호출을 통해서 대량의 데이터가 복제되는 일을 피할 수 있습니다. c언어에서는 포인터를 통해서 하지만 c++에서는 참조에 의한 호출을 통해서 합니다.
'IT 프로그래밍 > C++' 카테고리의 다른 글
[C++] Inline 함수 , 함수 오버로딩, typedef (0) | 2024.04.03 |
---|---|
[따배시 7.1 ~ 2 ] 매개변수와 실인자의 구분, 값에 의한 전달 (0) | 2024.04.02 |
[따배시 6.20~21] array 소개, vector 소개 (0) | 2024.03.30 |
[따배시 6 .19] 다중 포인터와 동적 다차원 배열 (0) | 2024.03.30 |
[따배시 6.17~18] for-each 반복, void 포인터 (0) | 2024.03.30 |