IT 프로그래밍/C++

참조에 의한 호출 c++

기술1 2024. 4. 1. 20:57
반응형

불필요한 부분을 잘라낼 때 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가지로 분류가 됩니다.

  1. 빌트인(built-in) 타입( 언어에서 제공되는 것) int, float, double, signed, unsigned...
  2. 유도된(derived) 타입 혹은 복합(compound, composite) 타입 (배열, 참조, 포인터, 함수)
  3. 사용자 정의(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++에서 참조에 의한 호출은 굉장히 광범위하게 사용이 됩니다.

  1. 호출된 함수에서 무언가를 직접적으로 조사를 하고싶을 때 (변경을 하고 그 호출의 결과가 다른 곳에 반영되길 원할 때)
  2. 내가 매개변수로 넘겨줄 데이터가 벡터와 같은 덩치가 큰 데이터일 때, 데이터를 통째로 복제할 필요가 없는 것

참조에 의한 호출을 통해서 대량의 데이터가 복제되는 일을 피할 수 있습니다. c언어에서는 포인터를 통해서 하지만 c++에서는 참조에 의한 호출을 통해서 합니다. 

반응형