본문 바로가기
Language/C++

vector 사용 시 []연산자와 at() 멤버 함수의 차이

by W00gie 2021. 1. 21.
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v;

	v.push_back(0);
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);

	for (vector<int>::size_type i = 0; i < v.size(); ++i)
	{
		cout << v[i] << " ";
	}
	cout << endl;

	cout << v.at(2) << endl; //at 멤버함수 이용
	cout << v[2] << endl; // []연산자 이용

	return 0;
}

[]연산자와 at()멤버 함수의 기능과 결과는 같다.

하지만 차이점은 범위 점검을 하는지 안하는지 차이가 있다.

범위 점검이란 흔히 나오는 out of range의 예외처리를 반환여부이다.

 

이러한 차이점 때문에

[]연산자는 보다 빠른 성능을 보이며 at() 함수는 비교적 속도가 느리고 안전하다.

at함수를 이용해 인덱스밖의 원소를 출력하려 하면 다음과 같은 로그를 확인할 수 있다.

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> v;

	v.push_back(0);
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);

	for (vector<int>::size_type i = 0; i < v.size(); ++i)
	{
		cout << v[i] << " ";
	}
	cout << endl;


	try {
		cout << v.at(6) << endl; //at 멤버함수에서 out of range 유도
	}
	catch (out_of_range& e)
	{
		cout << e.what() << endl;
	}

	return 0;
}

 

 

 

같은 내용의 코드를 []연산자를 통해 실행시 예외 처리는 지원되지 않는다.

 

[] 연산자 런타임에러