hyunjin

[함수 - 정수 N개의 합(15596)] for문 , vector call by ref 본문

알고리즘 연습/백준

[함수 - 정수 N개의 합(15596)] for문 , vector call by ref

_h.j 2020. 8. 13. 01:27
728x90

백준/정수N개의 합(15596) 

 

간단 문제 설명

정수 n개가 주어졌을 때, n개의 합을 구하는 함수를 작성해라

c++의 경우 : long long sum(vector <int> &a)

 

 

첫 번째 풀이

#include <vector>
using namespace std;

long long sum(vector<int> &a) {
	long long answer = 0;
	for (auto elem : a)
		answer += elem;
	return answer;
}

 

풀이 전략

for문으로 더한다.

 

다른 사람 풀이도 비슷하다.

배열, 반복자 등으로 풀면 된다. 

 

 

궁금한 점

함수의 인자를

void solution(vector <int> a) {}

로 주면 컴파일 에러가 난다. why??

 

 

알게 된 점

​void solution(vector<char> &v1, string s1){  } //1.vector<char> v1 으로 적으면 에러남

int main()
{
    vector<char> v1, string s1;
    solution(v1,s1); //2.solution(&v1, s1) 으로 호출하면 에러남
}
//1,2 에러가 발생하는 두 가지 경우
매개 변수로 포인터를 쓰는 것을 call by ref
call by ref :  x라는 포인터 변수(매개변수)에 alpha의 주소 값을 "복사"해서 넘기는 것

 

위의 경우 vector -> call by ref  

              string -> call by value

 

string 

& 없이 그냥 넣은 매개 변수 s1(string)은 main에서 복사해서 만든 별개의 변수

=>  main()내의 s1과 solution의 s1은 별개, 둘 중 뭘 수정해도 영향 없음, 스택에 따로 존재하기 때문

 

vector

vector는 조금 달라진다.

main()의 v1(vector)는 memory 스택 내에 실존하지만 solution의 &v1은 스택에 vector 존재하지 않는다.

solution의 &v1은 main() v1의 별칭

 

call by ref의 큰 이점

call by value : solution(v1,s1)에서 s1은 main()의 s1을 복사하기 때문에

-그 만큼 메모리 추가 사용

-복사하는데 걸리는 오버헤드

call by ref

-solution의 v1과 main.v1은 사실상 동일한 존재

-값을 복사하여 클래스를 새로 많들지 않아 오버헤드 적다.

-다만 함수 내에서 값을 수정하면 main.v1에도 영향이 가는 side effect 생김 주의!

 

vector는 &로 매개 변수 자리에 쓰고 넘길 땐 그냥 넘기면 되나봐

 

참고 사이트

c++ vector 매개변수로 넘길 때

 

728x90

'알고리즘 연습 > 백준' 카테고리의 다른 글

[문자열 - 단어 공부(1157)] string의 transform  (0) 2020.08.13
[함수 - 한수(1065)] C++ , sync_with_stido , endl > \n  (0) 2020.08.13
[2748] 피보나치수2  (0) 2020.08.05
[1149]RGB거리  (0) 2019.09.22
[1065]한수  (0) 2019.05.17