안녕하세요, 여행벌입니다.

오늘은 C++ STL list에 대해서 정리해보도록 하겠습니다.


list는 순차적인 컨테이너로, 메모리 할당은 vector와 달리 연속적으로 이루어지지 않습니다. 쉽게 비유하면 vector는 배열과 비슷하고 list는 연결 리스트와 비슷합니다. 따라서, 중간에 데이터 삭제와 삽입이 자주 발생하는 경우에는 list STL을 이용하는 것이 훨씬 효율적입니다.

 

#include<list>

using namespace std;

list Library는 다음과 같이 불러올 수 있습니다.

 

list<자료형> 변수명;

해당 자료형을 담을 list를 선언합니다.

 

front()

리스트의 첫 번째 요소의 레퍼런스 값을 반환합니다.

 

back()

리스트의 마지막 요소의 레퍼런스 값을 반환합니다.

 

begin()

리스트의 첫 번째 요소를 가리키는 반복자(iterator)를 반환합니다.

 

end()

end()가 가리키고 있는 것은 back()과 달리 맨 마지막 원소의 바로 다음번 원소이다. begin() 과 마찬가지로 반복자를 반환합니다.

empty()

리스트가 비었으면 true를 아니면 false를 반환합니다.

 

size()

리스트의 크기를 반환합니다.

 

push_front(원소)

리스트의 맨 앞에 원소를 삽입합니다.

 

push_back(원소)

리스트의 맨 뒤에 원소를 삽입합니다.

 

pop_front()

리스트의 맨 앞의 원소를 삭제합니다.

 

pop_back()

리스트의 맨 뒤의 원소를 삭제합니다.

 

resize(int 크기) , resize(int 크기, 초기값)

리스트의 크기를 다시 조정해줍니다. 리스트의 기존 크기가 더 컸다면, 나머지 부분이 삭제가 되고 작았다면 초기값으로 초기화되면서 추가됩니다. 초기값을 주지 않으면 0으로 초기화됩니다.

 

insert(iterator 위치, 원소), insert(iterator 위치, int 개수, 원소)

리스트의 iterator 위치에 원소를 삽입합니다. / 리스트의 iterator 위치에 원소를 입력된 개수만큼 삽입합니다.

 

erase(iterator 위치), erase(iterator 시작위치, iterator 끝위치)

리스트의 iterator 위치의 원소를 삭제합니다. / 리스트의 iterator 시작 위치부터 끝 위치 전까지 원소를 삭제합니다.

 

예시

#include<iostream>
#include<list>

using namespace std;

int main(void) {
	list<int> L;
	for (int i = 1; i <= 10; i++)
		L.push_back(i);
	/* L : 1 2 3 4 5 6 7 8 9 10 */

	cout << L.front() << '\n'; // 1
	cout << L.back() << '\n'; // 10
	cout << *L.begin() << '\n'; // 1
	//cout << *L.end() << '\n'; // error
	cout << L.empty() << '\n'; // 비어있지않으므로 0(false)
	cout << L.size() << '\n'; // 10개의 원소가 있으므로 10 반환
	
	L.pop_front();
	/* L : 2 3 4 5 6 7 8 9 10 */
	L.pop_back();
	/* L : 2 3 4 5 6 7 8 9 */
	L.push_front(1);
	/* L : 1 2 3 4 5 6 7 8 9 */
	L.resize(5);
	/* L : 1 2 3 4 5 */
	L.resize(7, 10);
	/* L : 1 2 3 4 5 10 10 */

	list<int>::iterator it1 = L.begin(), it2 = L.end();
	/* L : 1 2 3 4 5 10 10 */
	/*     ^(it1)          */
	/*                      ^(it2)*/
	it2--; it2--;
	/* L : 1 2 3 4 5 10 10 */
	/*     ^(it1)          */
	/*                ^(it2)*/
	L.erase(it1, it2);
	/* L : 10 10 */
	it1 = L.begin(), it2 = L.end();
	L.insert(it2, 100);
	/* L : 10 10 100*/
	L.insert(it1, 3, 1);
	/* L : 1 1 1 10 10 100 */
}


 

안녕하세요, 여행벌입니다.

오늘은 우선순위큐(Priority Queue)에 대해서 알아보도록 하겠습니다.


1. Priority_Queue(우선순위큐) 란?

Priority_Queue는 Queue의 한 종류로 이름 그대로 우선순위에 따라 정렬된 Queue입니다.

[Queue 포스팅 : https://travelbeeee.tistory.com/7?category=807507 ]

어떤 원소가 Push(삽입)된다면 주어진 우선순위에 맞춰서 Queue가 정렬되고, Pop(삭제)는 정렬된 Queue의 앞에서 이루어집니다. 자료구조 Heap으로 구현되었기 때문에, 특정 원소를 Push해 생기는 정렬 과정은 O(logN) 만에 이루어집니다.

 

2. C++ STL 우선순위큐 라이브러리 기본 명령어

#include<queue>

queue와 동일한 Library에서 지원해줍니다.

선언
- priority_queue<자료형, Container, 비교함수> 변수명
선언한 자료형 변수들을 비교함수에 따라 정렬하는 Priority_Queue(우선순위큐)를 선언.

- priority_queue<자료형> 변수명
선언한 자료형 변수들을 내림차순에 따라 정렬하는 Priority_Queue(우선순위큐)를 선언.

ex) priority_queue<int, vector<int>, cmp> pq 
int형 변수들을 cmp 우선순위에 따라 정렬하는 pq라는 이름의 Priority_queue(우선순위큐)를 선언.

추가 및 삭제
- push(element) : Priority_Queue(우선순위큐)에 원소를 삽입. ( 비교함수에 따라 내부적으로 정렬됨 )
- pop() : 맨 앞에 있는 원소를 삭제.

서칭
- top() : 맨 앞에 있는 원소를 반환.

기타
- empty() : Priority_Queue(우선순위큐)가 비어있으면 true 아니면 false를 반환
- size() : Priority_Queue(우선순위큐)의 크기를 반환

기본 함수는 다음과 같습니다.

 

이제, 예시를 통해서 익혀보겠습니다.

[예시1) 기본 - 내림차순]

#include<iostream>
#include<queue>

using namespace std;

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	priority_queue<int> pq;
	pq.push(5);
	pq.push(1);
	pq.push(7);
	for (int i = 0; i < 3; i++){
		cout << pq.top() << ' ';
		pq.pop();
	}
}
출력
7 5 1

int형 원소들을 내림차순에 따라 정렬하는 우선순위큐를 만들었습니다.

5 / 1 / 7 을 차례대로 입력하고 하나하나 출력해보니 7 / 5 / 1 순으로

비교기준(내림차순)에 따라 정렬되어있는 것을 확인할 수 있습니다.

#include<iostream>
#include<queue>

using namespace std;

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	priority_queue<char> pq;
	pq.push('5');
	pq.push('1');
	pq.push('7');
	for (int i = 0; i < 3; i++){
		cout << pq.top() << ' ';
		pq.pop();
	}
}
출력
7 5 1

이번에 char형 원소들을 내림차순에 따라 정렬하는 우선순위큐를 만들었습니다.

마찬가지로, 아스키코드값이 더 큰 '7', '5', '1' 순으로 정렬되어있는 것을 볼 수 있습니다.

 

[예시2) 기본 - 올림차순]

#include<iostream>
#include<queue>

using namespace std;

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	priority_queue<int, vector<int>, greater<int>> pq;
	pq.push(5);
	pq.push(1);
	pq.push(7);
	for (int i = 0; i < 3; i++){
		cout << pq.top() << ' ';
		pq.pop();
	}
}
출력
1 5 7

비교함수에 greater<int> 를 넣어주면 반대로 오름차순에 따라 정렬되는 우선순위큐를 만들 수 있습니다.

#include<iostream>
#include<queue>

using namespace std;

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	priority_queue<char, vector<char>, greater<char>> pq;
	pq.push('5');
	pq.push('1');
	pq.push('7');
	for (int i = 0; i < 3; i++){
		cout << pq.top() << ' ';
		pq.pop();
	}
}
출력
1 5 7

char형 변수에서도 greater<char>를 넣어주면 오름차순에 따라 정렬되는 우선순위큐를 만들 수 있습니다.

 

[예시3) 비교함수 선언1]

내림차순, 오름차순으로 정렬하는 우선순위큐는 쉽게 선언할 수 있습니다.

그렇다면, 내가 원하는 우선순위를 지정해주려면 어떻게 해야 될까요?

연산자 오버로딩을 통해 원하는 우선순위대로 구현할 수 있습니다.

아래 예시를 통해서 익혀보겠습니다.

#include<iostream>
#include<queue>
#include<cmath>
using namespace std;

struct cmp {
	bool operator()(int n1, int n2) {
		if (abs(n1) > abs(n2))
			return true;
		else if (abs(n1) == abs(n2))
			if (n1 > n2)
				return true;
			else
				return false;
		return false;
	}
};

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	priority_queue<int, vector<int>, cmp> pq;
	pq.push(1);
	pq.push(-1);
	pq.push(7);
	pq.push(-4);
	pq.push(15);

	for (int i = 0; i < 5; i++){
		cout << pq.top() << ' ';
		pq.pop();
	}
}

먼저 struct cmp 부분을 살펴보겠습니다.

struct cmp {
	bool operator()(int n1, int n2) {
		if (abs(n1) > abs(n2))
			return true;
		else if (abs(n1) == abs(n2))
			if (n1 > n2)
				return true;
			else
				return false;
		return false;
	}
};

위의 코드는 '절대값이 더 작은 값에 우선순위를 높게 주고, 절대값이 같다면 더 작은 값에 우선순위를 높게 줄 거예요!' 

라고 선언한 것과 같습니다.

따라서, 다음과 같이 출력됩니다.

출력
-1 1 -4 7 15

우선순위큐 포스팅은 여기서 마치겠습니다.

 

 

안녕하세요, 여행벌입니다.

오늘은 저번 포스팅에 이어서 String Library 함수들을 소개해보겠습니다.

 

[String Library 소개(1)]

https://travelbeeee.tistory.com/123


6. append() 함수

append() 함수는 하나의 문자열의 끝에 다른 문자열을 추가하는 함수입니다.

저번 포스팅에서 다뤘던 '+' 연산자랑 같은 기능을 하지만,

조금 더 다양한 기능을 할 수 있어서 상황에 따라 유용하게 사용할 수 있습니다.

-append() 함수

1. 문자열.append(추가할문자열);

// 추가할 문자열을 맨 끝에 추가함.

 

2.문자열.append(추가할문자열, 시작위치, 개수);

// 추가할 문자열의 시작 위치부터 개수만큼만 맨 끝에 추가함.

 

3.문자열.append(개수, 추가할문자);

//추가할 문자를 개수만큼 맨 끝에 추가함.

예제를 통해 3가지 유형을 다 익혀보도록 하겠습니다.

 

#include<iostream>
#include<string>

using namespace std;

int main(void) {
	string input1, input2, input3, input4;
	input1 = "abcde";
	input2.append(input1); //input2에 input1을 복사한다.
	cout << "input2는 : " << input2 << '\n';
	input3.append(input1, 3, 2);
	cout << "input3는 : " << input3 << '\n';
	input4.append(3, 'x');
	cout << "input4는 : " << input4 << '\n';
}

 

먼저 input1 에 "abcde"를 저장하고,

input2에 input2.append(input1)을 이용하여 input2의 끝에 input1을 추가해보겠습니다.

예상 결과는 input2 = "abcde" 입니다.

input3 에는 input1에 저장된 "abcde" 문자열의 3번 인덱스부터 2글자를 추가해보겠습니다.

예상 결과는 input3 = "de"입니다.

input4에는 문자 'x'를 3번 반복해서 추가해보도록 하겠습니다.

예상 결과는 input4 = "xxx" 입니다.

과연 예상대로 결과가 나올까요?

결과 :
input2는 : abcde
input3는 : de
input4는 : xxx

 

예상대로 잘 나오네요!

 

여기서 주의할 점은, 3번째 함수 원형은 문자열이 아닌 문자만 가능하다는 점입니다.

input4에 "abc"를 4번 추가하고 싶어도, input4.append(4,"abc") 라고 입력하면 오류가 발생합니다.

 

7. find() 함수

find 함수는 특정 문자열을 찾아, 그 시작 위치(int 형)을 반환하는 함수입니다.

-find() 함수 

1.문자열.find(찾을 문자열)

// 인덱스 0부터 찾을 문자열을 찾아, 그 시작 위치를 반환함.

 

2. 문자열.find(찾을 문자)

// 인덱스 0부터 찾을 문자를 찾아, 그 시작 위치를 반환함.

 

3. 문자열.find(찾을문자열, 시작위치)

// 시작 위치부터 찾을 문자열을 찾아, 그 시작 위치를 반환함.

예시를 통해서 익혀볼까요?

#include<iostream>
#include<string>

using namespace std;

int main(void) {
	string input1 = "abcdefghijklmnopqrstuvwxyz";
	cout << "문자열 efg 의 첫 시작 인덱스는 : " << input1.find("efg") << '\n';
	cout << "문자열 afg 의 첫 시작 인덱스는 : " << input1.find("afg") << '\n';
	cout << "문자 k 의 첫 시작 인덱스는 : " << input1.find('k') << '\n';
	cout << "문자 A 의 첫 시작 인덱스는 : " << input1.find('A') << '\n';
	cout << "문자열 efg 를 인덱스 10번 부터 찾았을 때 : " << input1.find("efg", 10) << '\n';
	cout << "문자열 afg 를 인덱스 3번 부터 찾았을 때 : " << input1.find("afg", 3) << '\n';
}

 

input1에서 "efg" 문자열을 찾고 싶습니다.

input1에 "efg" 문자열이 인덱스 4~6 에 있으므로, 4를 반환할 것 같습니다.

두 번 째로는, input1에서 "afg" 문자열을 찾고 싶습니다.

그런데 input1에 "afg" 문자열이 없으므로, 쓰레기 값이 반환되겠죠?

그다음으로는 input1에서 'k', 'A' 문자를 찾고 싶습니다.

'k' 는 인덱스 10 이므로 10을 반환하고, 'A' 는 input1에 없으므로, 쓰레기 값을 반환하겠죠?

마지막으로 "efg" 문자열을 10번 인덱스부터 찾고 싶습니다.

"efg" 문자열은 인덱스 4~6에 존재하므로, 쓰레기 값이 반환될 것 같습니다.

마찬가지로 "afg" 문자열은 존재하지 않으므로, 쓰레기 값이 반환될 것 같습니다.

문자열 efg 의 첫 시작 인덱스는 : 4
문자열 afg 의 첫 시작 인덱스는 : 4294967295
문자 k 의 첫 시작 인덱스는 : 10
문자 A 의 첫 시작 인덱스는 : 4294967295
문자열 efg 를 인덱스 10번 부터 찾았을 때 : 4294967295
문자열 afg 를 인덱스 3번 부터 찾았을 때 : 4294967295

 

 

8. compare() 함수

compare() 함수는 두 문자열을 비교하는 함수 입니다.

-compare() 함수 

문자열1.compare(문자열2)
// 문자열1과 문자열2를 비교해서 상황에 따라 다른 int형 값을 반환합니다.

만약 문자열1과 문자열2가 같다면, int형 0을 반환합니다.

문자열1과 문자열2가 다르다면, 달라지는 그 순간의 문자에 대해서

문자열1 이 문자열2 보다 사전 순으로 앞에 있을 경우 -1

뒤에 있을 경우 1을 반환합니다.

 

사전 순으로 계산하는 방법이 생각보다 복잡하므로,

같으면 0 다르면 0이 아닌 숫자가 나온다고 생각하고 사용해도 좋을 것 같습니다.

#include<iostream>
#include<string>

using namespace std;

int main(void) {
	string input1 = "abc", input2 = "ade", input3 = "a\c", input4 = "abc";
	std::cout << input1.compare(input2) << " " << input1.compare(input3) << '\n';
	std::cout << input1.compare(input4);
}
출력 결과 :
-1 -1
0

 

input2, input3를 input1이랑 다르므로 0이 아닌 값, input4는 같으므로 0이 출력되는 것을 볼 수 있습니다.

 

9. replace() 함수

replace() 함수는 특정 문자열을 찾아 그 문자열을 다른 문자열로 대체하는 함수입니다.

-replace() 함수

문자열.replace(대체할 문자열의 시작 위치, 대체할 문자열의 길이, 새로운 문자열)
//전달된 시작 위치부터 대체할 문자열의 길이만큼 삭제 후 새로운 문자열을 추가한다.

바로 예시를 통해 익혀볼까요?

#include<iostream>
#include<string>

using namespace std;

int main(void) {
	string input1 = "I am a good student.";
	std::cout << input1.replace(5, 4, "bad");
}

input1 = "I am good student." 에서 5번 째 인덱스 g 부터 4글자, 즉 good을 bad로 대체해보았습니다.

출력 결과 :
I am a bad student.

 

예상한 대로 잘 출력되는 것을 확인할 수 있습니다.


이처럼 C++은 C와는 달리 String Library를 통해서 Python만큼 문자열을 쉽게 다룰 수 있습니다.

잘 익혀두는 게 좋겠죠?

 

이상으로 String Library 소개를 마치겠습니다.

 

 

 

 

안녕하세요, 여행벌입니다.

 

오늘은 그동안 알고리즘 문제를 풀면서, 유용하게 사용하던 string library를 정리하려고 합니다.


C++에서는 문자열을 두 가지 방법으로 생성할 수 있습니다.

 

1. C언어 스타일의 문자(배)열

2. string 클래스를 이용한 문자열

 

C언어와는 다르게 C++에서는 string library에서 string 클래스를 지원해주는데요.

문자열을 다룰 때, 배열을 선언하지 않아도 되고, 너무 유용한 것 같습니다!

 

C언어 스타일의 문자(배)열을 이용한다면 문제점이 생기는데요!

이름이랑, 주소를 입력받아 출력하는 예제를 생각해볼까요?

#include<iostream>

int main(void) {
	char name[20];
	char address[20];
	std::cout << "자신의 이름과 살고 있는 도시를 적어주세요.\n";
	std::cin >> name >> address;
	std::cout << "이름 : " << name << '\n' << "주소 : " << address;
}

 

바로 문자 배열의 마지막에는 '\n' 이 들어가 있기 때문에, 이름과 주소를 19글자까지 밖에 입력받지 못한다는 점입니다.

출력 결과 :
자신의 이름과 살고 있는 도시를 적어주세요.
abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
이름 : abcdefghijklmnopqrs
주소 : ABCDEFGHIJKLMNOPQRS

 

C++에서는 크기가 고정되지 않은 string 클래스를 이용해 문제를 해결할 수 있습니다.

#include<iostream>
#include<string>

int main(void) {
	std::string name, address;
	std::cin >> name >> address;
	std::cout << name << '\n' << address;
}
출력 결과 :
자신의 이름과 살고 있는 도시를 적어주세요.
abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
이름 : abcdefghijklmnopqrstuvwxyz
주소 : ABCDEFGHIJKLMNOPQRSTUVWXYZ

 

훨씬 편하죠?! C++은 문자열 다루기도 너무 편한 것 같습니다!

 

예시를 조금만 더 볼까요?

string input1 변수에 "abcde"를 저장했다고 해봅시다!

그러면 첫 번째 글자인 a 와 세 번째 글자인 c를 출력하고 싶다면 어떻게 해야 될까요?

문자 배열을 다룰 때랑 똑같이 하면 됩니다!

#include<iostream>
#include<string>

int main(void) {
	std::string input1 = "abcde";
	std::cout << input1[0] << " " << input1[2];
}
출력 결과 :
a c

 

이제 String에 대해서 자세히 배워보도록 할까요?

 

1.문자열 처리 - 복사

C언어에서는 문자열1을 문자열2에 대입하기 위해서는 strcpy / strncpy 함수를 이용해야 합니다.

하지만 C++에서는 쉽게 문자열 대입을 할 수 있습니다.

예제를 통해 확인하겠습니다.

#include<iostream>
#include<string>

int main(void) {
	std::string input1 = "abcde", input2;
	input2 = input1;
	std::cout << input2;
}

 

input1에 "abcde"를 저장하고, input2에 input1을 복사하고 싶습니다.

과연 input2 = input1; 을 하면 알아서 복사가 될까요?

출력 결과 :
abcde

 

출력 결과를 보시면 에러 없이 input2에 "abcde"가 복사된 것을 보실 수 있습니다.

 

2. 문자열 처리 - 이어붙이기

또, C언어에서는 문자열1 뒤에 문자열2를 이어 붙이고 싶으면, strcat / strncat 함수를 이용해야 합니다.

하지만, C++에서는 간단하게 두 문자열을 이어붙일 수 있습니다.

#include<iostream>
#include<string>

int main(void) {
	std::string input1 = "abcde", input2 = "fghijklmn";
	std::string input3 = input1 + input2;
	std::cout << input3;
}

input1 과 input2를 '+' 연산자를 통해 과연 이어 붙일 수 있을까요?

출력 결과 :
abcdefghijklmn

 

별다른 함수를 사용하지 않고도, 쉽게 이어붙일 수 있습니다!

 

3. 문자열 입/출력 - cin, cout, getline

C++에서는 printf / scanf 대신에 cout / cin 을 이용해 입력, 출력을 처리합니다.

과연, cin 은 띄어쓰기를 어떻게 받아들일까요?

이름과 주소를 입력받아 출력하는 경우에 대해서 생각해보도록 하겠습니다.

#include<iostream>
#include<string>

int main(void) {
	std::string input1, input2;
	std::cout << "주소를 입력해주세요.\n";
	std::cin >> input1;
	std::cout << "이름을 입력해주세요.\n";
	std::cin >> input2;
	std::cout << "입력 받은 주소 : " << input1 << '\n';
	std::cout << "입력 받은 이름 : " << input2 << '\n';
}

입력 주소에는 '동대문구 왕산로 37길 47', 입력 이름에는 '홍길동 짱짱맨'을 입력한다고 해봅시다.

다음과 같은 출력을 예상할 수 있을 것입니다.

예상 출력 결과 :
주소를 입력해주세요.
동대문구 왕산로 37길 47
이름을 입력해주세요.
홍길동 짱짱맨
입력 받은 주소 : 동대문구 왕산로 37길 47
입력 받은 이름 : 홍길동 짱짱맨

하지만, 예상과는 다르게 출력이 되는데요!

출력 결과 :
주소를 입력해주세요.
동대문구 왕산로 37길 47
이름을 입력해주세요.
입력 받은 주소 : 동대문구
입력 받은 이름 : 왕산로

 

심지어, 두 번째, 이름에 대한 입력은 입력도 안 받은 것 같은데요?

그 이유는 '띄어쓰기' 때문입니다.

cin 함수는 띄어쓰기와 개행(Enter)를 기준으로 입력을 나눠서 받는데요!

동대문구 왕산로 37길 47에서 동대문구하고 띄어쓰기가 있기 때문에 동대문구만 input1에

왕산로하고 띄어쓰기가 있기 때문에 왕산로만 input2에 저장이 된 것입니다.

 

그렇다면, 제대로 된 출력을 받기 위해서는 어떻게 해야 될까요?

getline 함수를 이용해야 합니다!

띄어쓰기를 포함해서 한 줄을 입력받겠다는 뜻입니다.

#include<iostream>
#include<string>

int main(void) {
	std::string input1, input2;
	std::cout << "주소를 입력해주세요.\n";
	getline(std::cin, input1);
	std::cout << "이름을 입력해주세요.\n";
	getline(std::cin, input2);
	std::cout << "입력 받은 주소 : " << input1 << '\n';
	std::cout << "입력 받은 이름 : " << input2 << '\n';
}
출력 결과 :
주소를 입력해주세요.
동대문구 왕산로 37길 47
이름을 입력해주세요.
홍길동 짱짱맨
입력 받은 주소 : 동대문구 왕산로 37길 47
입력 받은 이름 : 홍길동 짱짱맨

 

제대로 출력이 되죠??

 

그러면, 이제 string library에 있는 함수들에 대해서 정리해보도록 하겠습니다.

 

4. length() 함수

문법구조 : 'string이름.length()' 이고 반환 값은 int형 입니다.

이름 그대로 string의 길이를 반환해주는 함수입니다.

#include<iostream>
#include<string>

int main(void) {
	std::string input1;
	std::cin >> input1;
	std::cout << input1.length();
}
출력 결과:
abcde
5

 

이 함수는 알고리즘 문제를 풀 때, 가장 많이 쓰는 것 같습니다.

 

5. stoi() 함수

문법구조 :' stoi(string 변수 이름)' 이고 반환 값은 int형입니다.

말 그대로 string to integer의 약자이고

Char 0~9로 이루어진 string을 integer로 바꿔주는 함수입니다.

#include<iostream>
#include<string>

int main(void) {
	std::string input1;
	std::cin >> input1;
	std::cout << stoi(input1);
}
출력 결과:
변환하고 싶은 숫자로 이루어진 문자열을 입력하시오.
12345
12345

 

위의 12345는 문자열이고, 아래의 12345는 int형입니다!

주의해야 할 점은, int형으로 반환한다는 점입니다!

int형의 양수 최대 값인 2,147,483,647을 넘는 값을 입력하면 프로그램이 에러가 나겠죠?

출력 결과:
변환하고 싶은 숫자로 이루어진 문자열을 입력하시오.
2147483648

2147483648을 입력하면 프로그램이 에러 코드와 함께 멈추는 것을 확인할 수 있을 겁니다.


String library에는 많은 함수가 있기 때문에, 오늘은 여기까지만 정리하도록 하고

다음 포스팅에서 이어서 공부해보도록 하겠습니다.

 

 

 

 

 

 

+ Recent posts