list 란 ?

- 연결 리스트를 C++로 구현한것

- 양 끝의 위치 삽입 삭제 가능

- 임의의 위치에 삽입 삭제 가능

 

list 사용법

헤더

-#include<list>

 

- 선언방법

list<데이터 타입>리스트 이름; 
list<데이터 타입>리스트 이름(크기);
list<데이터 타입>리스트 이름(크기, 초기화);
*c++11이상 버전 부터 list<데이터 타입>리스트 이름{a,b,c,d,e...}; 초기화 가능

list 선언방법

 

-삽입, 삭제

push_front(데이터); 리스트 맨 앞에 데이터 추가
push_back(데이터); 리스트 맨 뒤에 데이터 추가
insert(iterator, 데이터); iterator가 가르키는 부분 앞에 데이터 추가
pop_front(); 리스트 맨 앞의 데이터 삭제
pop_back(); 리스트 맨 뒤의 데이터 삭제
erase(iterator); iterator가 가르키는 부분의 원소 삭제

 

총 코드

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

int main()
{
	//list<데이터 타입>리스트 이름; 
	list<int> list1;
	//list<데이터 타입>리스트 이름(크기);
	list<int> list2(5);
	//list<데이터 타입>리스트 이름(크기, 초기화);
	list<int> list3(5, 10);

	for (auto i : list2)
		cout << i << ", ";
	cout << endl;
	for (auto i : list3)
		cout << i << ", ";
	cout << endl;

	//push_back(데이터);
	list1.push_back(7);
	list1.push_back(9);
	list1.push_back(10);
	//push_front(데이터);
	list1.push_front(6);
	list1.push_front(5);
	list1.push_front(4);
	cout << "push_back, push_front 데이터 삽입" << endl;
	for (auto i : list1)
		cout << i << ", ";
	cout << endl;
	list<int>::iterator iter = list1.begin();
	iter++;
	iter++;
	iter++;
	iter++;
	cout << "insert 데이터 삽입" << endl;
	//insert(iterator, 데이터);
	list1.insert(iter, 8);

	for (auto i : list1)
		cout << i << ", ";
	cout << endl;
	//pop_front();
	list1.pop_front();
	list1.pop_front();
	//pop_back();
	list1.pop_back();
	list1.pop_back();

	//cout << "pop_front(), pop_back() 데이터 제거" << endl;
	for (auto i : list1)
		cout << i << ", ";
	cout << endl;
	
	iter = list1.begin();
	iter++;
	cout << "erase 데이터 제거" << endl;
	//erase(iterator);
	list1.erase(iter);

	for (auto i : list1)
		cout << i << ", ";
	cout << endl;
}

'프로그래밍 공부 > STL' 카테고리의 다른 글

문자열 처리함수 c_str()  (0) 2022.02.27
C++ STL set & multiset  (0) 2022.02.17
C++ STL deque란?  (0) 2022.02.17
STL vector 란?  (0) 2022.02.13
C++ STL 이란?  (0) 2022.02.12

2.  shared_ptr

- 하나의 객체를 참조하는 스마트 포인터의 갯수를 참조하는 스마트 포인터

- 참조 횟수(reference count) : 새로운 shared_ptr 추가시 1증가, 제거시 1감소

- 참조 횟수가 0이 되면 메모리를 자동으로 해제

 

사용법

#include<memory> 추가

shared_ptr<객체>스마트 포인터 명(new 객체);

shared_ptr<객체>스마트 포인터 명 = make_shared<객체>(인수);

shared_ptr 객체 Lee를

sharedLee로 참조하여 레퍼런스 카운터가 2가 되었고

Lee를 해제시 sharedLee가 같은 값을 참조하고 있으므로 데이터는 삭제되지않고 

러퍼런스 카운터만 1 줄어든다.

 

총 코드

#include<iostream>
#include<memory>
#include<string>
using namespace std;

class Person
{
	string name;
	int age;
public:
	Person(const string& name, int age);
	~Person();
	void ShowData();
};

Person::Person(const string& name, int age)
{
	this->age = age;
	this->name = name;
	cout << "Person 생성자 생성" << endl;
}

Person::~Person()
{
	cout << "Person 소멸자 생성" << endl;
}

void Person::ShowData()
{
	cout << "나이 : " << age << endl;
	cout << "이름 : " << name << endl;
}

int main()
{
	shared_ptr<Person> Lee(new Person("JaeWoo", 31));
	Lee->ShowData();
	cout << "reference count : " << Lee.use_count() << endl;

	auto sharedLee(Lee);
	cout << "reference count : " << Lee.use_count() << endl;

	Lee.reset();
	cout << "reference count : " << sharedLee.use_count() << endl;

	shared_ptr<Person> Lee2 = make_shared<Person>("JaeWoo", 31);
	Lee2->ShowData();
	cout << "reference count : " << Lee2.use_count() << endl;
	auto sharedLee2(Lee2);
	cout << "reference count : " << Lee2.use_count() << endl;
	sharedLee2.reset();
	cout << "reference count : " << Lee2.use_count() << endl;
}

'프로그래밍 공부 > modern C++' 카테고리의 다른 글

modern C++ 범위 기반 for문 (rage-based for statement)  (0) 2022.02.18
auto  (0) 2022.02.17
스마트 포인터 weak_ptr  (0) 2022.02.17
스마트 포인터란? && unique_ptr  (0) 2022.02.13
Modern C++ 이란?  (0) 2022.02.12

if(!)는

if문 안의 내용을 부정했을 때 (반대로 했을 때) 참 값이면 실행된다

bool 변수 TF 가 false 일때

if(!TF) 실행

bool 변수 TF 가 true 일때

if(TF) 실행

 

if(num ==4)  -> num이 4 일때 출력

if(!(num==4)) -> num이 4가 아닐 때 출력 

if(!(num==5)) -> num이 5가 아닐 때 출력

고로 

if(!)는

if문 안의 내용을 부정했을 때 (반대로 했을 때) 참 값이면 실행된다

*true == 1

 false == 0

if()문은 내부가 true면 실행한다

if(!)문은 내부가 false면 실행한다

#include <iostream>
using namespace std;

int main()
{
	bool TF = false;


	if (TF)
		cout << "TF->false 일때 if(TF)" << endl;
	if (!TF)
		cout << "TF->false 일때 if(!TF)" << endl;

	TF = true;

	if (TF)
		cout << "TF->true 일때 if(TF)" << endl;
	
	if (!TF)
		cout << "TF->true 일때 if(TF)" << endl;

	int num = 4;

	if (num == 4)
		cout << "num 이 4면 출력" << endl;

	if (!(num == 4))
		cout << "num 이 4가 아니면 출력" << endl;

	if (!(num == 5))
		cout << "num 이 5가 아니면 출력" << endl;

}

'프로그래밍 공부 > 궁금한 정보들' 카테고리의 다른 글

c++ map 과 hash_map 의 차이  (0) 2022.03.01
용어 정리  (0) 2022.02.17
C++ 구조체와 클래스 차이  (0) 2022.02.04
문자열 _T 매크로, C++ 리터럴이란  (0) 2018.01.04
가변인자 함수  (0) 2018.01.03

vector 란?

- 동적 배열구조를 C++로 구현한 것 (가변적 배열)

- 맨 끝에서만 삽입, 삭제 가능

- 크기가 동적으로 변하고 메모리가 연속적

- 속도적인 측면에서는 느리다.

 

vector 사용법

헤더

- #include<vector>

 

- 선언 방법

vector<데이터 타입> 벡터 이름;
vector<데이터 타입> 벡터 이름(크기);
vector<데이터 타입> 벡터 이름(크기, 초기화 상수);

vector 선언방법

- 삽입, 삭제

v.push_back(데이터); 데이터를 맨 끝에 삽입
v.pop_back();   데이터 맨 끝을 삭제
v.insert(데이터위치, 데이터); 삽입하고 싶은 위치에 데이터 삽입

삽입 삭제

- 원소 참조

v[i];    i 번째 원소 참조
v.at();   i 번째 원소 참조
v.front(); 벡터의 첫번째 원소를 참조
v.back();   벡터의 마지막 원소를 참조 
v.begin(); iterator 사용시 벡터의 첫번째 데이터 위치를 가르킴
v.end();   iterator 사용시 벡터의 마지막 데이터 위치를 가르킴

iterator 사용 begin() end()

- 크기 변경

v.size() 벡터 원소 갯수를 반환
v.capacity() 할당된 벡터의 원소 갯수 반환
v.resize(n) 벡터를 n 크기로 변경
v.resize(n, m) 벡터를 n 크기로 변경 후 데이터를 m으로 초기화
v.empty() 벡터가 비어 있으면 true 반환 아닐 시 false 반환

 

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

int main()
{
	vector<int> v;
	vector<int> v1(10);
	vector<int> v2(10, 3);

	for (auto i : v1)
		cout << i<<", ";
	cout << endl;
	/*for (auto i : v2)
		cout << i << ", ";*/
	
	cout << "삽입 삭제" << endl;
	v.push_back(4);
	v.push_back(5);
	v.push_back(3);
	cout << "v[1]: ";
	cout << v[1] << endl;
	cout << "v.at(1): ";
	cout << v.at(1) << endl;
	cout << "v.front(): ";
	cout << v.front() << endl;
	cout << "v.back(): ";
	cout << v.back() << endl;
	while (!v.empty())
	{
		cout << v.back() << endl;
		v.pop_back();
	}
	vector<int>::iterator iter;
	for (iter = v2.begin(); iter < v2.end(); iter++)
		cout << *iter;

}

'프로그래밍 공부 > STL' 카테고리의 다른 글

문자열 처리함수 c_str()  (0) 2022.02.27
C++ STL set & multiset  (0) 2022.02.17
C++ STL deque란?  (0) 2022.02.17
C++ STL list 란?  (0) 2022.02.15
C++ STL 이란?  (0) 2022.02.12

스마트 포인터 (Smart Pointer)

- 포인터처럼 동작하는 클래스 템플릿

- 메모리를 자동으로 해제

 

스마트 포인터 종류

c++98  -> auto_ptr   //c++11 표준부터 삭제

c++11 이후 -> unique_ptr, shared_ptr, weak_ptr

 

1. unique_ptr

- 하나의 스마트 포인터만이 특정 객체를 소유할 수 있다.

- 해당 객체의 소유권을 가지고 있을 때만 소멸자가 해당 객체를 삭제할 수 있다.

- 복사 생성자와 복사 대입연산자가 구현되어 있지않아 복사가 불가능하다.

- move()멤버 함수를 통해 소유권을 이전(이동)할 수 있다. 

- 소유권을 이전(이동)한 스마트 포인터는 해당 객체를 소유하지 않게 된다.

 

사용법

#include<memory> 추가

unique_ptr<객체> 스마트 포인터 명(new 객체);

unique_ptr<객체> 스마트 포인터 명 = make_unique<객체>(인수);      //make_unique  c++14부터 표준으로 추가

unique_ptr 사용법

move();  -> 이동

get(); -> 얻기

reset();  -> 해제

-> Lee 값에서 Lee2 값으로 move() 하였으므로

-> Lee 값은 nullptr 이고 Lee2 값이 Lee 값을 가지게 되었다.

 

make_unique()

- 전달 받은 인수를 사용해 지정된 타입의 객체를 생성하고 생성된 객체를 가리키는 unique_ptr을 반환

 

총 코드

#include<iostream>
#include<memory>
#include<string>
using namespace std;

class Person
{
	string name;
	int age;
public:
	Person(const string& name, int age);
	~Person();
	void ShowData();
};

Person::Person(const string& name, int age)
{
	this->age = age;
	this->name = name;
	cout << "Person 생성자 생성" << endl;
}

Person::~Person()
{
	cout << "Person 소멸자 생성" << endl;
}

void Person::ShowData()
{
	cout << "나이 : " << age << endl;
	cout << "이름 : " << name << endl;
}

int main()
{
	//unique_ptr<객체> 스마트 포인터 명(new 객체);
	unique_ptr<Person> Lee(new Person("JaeWoo", 31));
	//Lee->ShowData();

	//auto Lee2 = Lee;
	cout << "Lee 값 : ";
	cout << Lee.get() << endl;
	cout << "Lee2 로 이동" << endl;
	auto Lee2 = move(Lee);
	cout << "Lee2 값 : ";
	cout<<	Lee2.get()<<endl;
	cout << "이동 후 Lee 값 : ";
	cout << Lee.get() << endl;
	cout << "Lee2 해제하여 소멸자 호출 "<<endl;

	Lee2.reset();
	cout << Lee2.get() << endl;

	//unique_ptr<객체> 스마트 포인터 명 = make_unique<객체>(인수); 
	//unique_ptr<Person> Kim = make_unique<Person>("Moon", 30);
	//Kim->ShowData();
}

 

'프로그래밍 공부 > modern C++' 카테고리의 다른 글

modern C++ 범위 기반 for문 (rage-based for statement)  (0) 2022.02.18
auto  (0) 2022.02.17
스마트 포인터 weak_ptr  (0) 2022.02.17
스마트 포인터 shared_ptr  (0) 2022.02.15
Modern C++ 이란?  (0) 2022.02.12

오류 C2679 이항 '<<': 오른쪽 피연산자로 'std::string' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다.

 

오류 발생 string name을 출력할 수 없는 문제가 발생하였다. 

 

#include<string> 을 추가 해주면 해결된다.

 

STL (Standard Template Library) : 표준 템플릿 라이브러리

- C++을 위한 라이브러리

- 알고리즘, 컨테이너, 함수자, 반복자 네가지의 구성

 

컨테이너 (Container)

- 자료형을 담는 일종의 자료구조

- 같은 타입의 여러 객체를 저장하는 일종의 잡합

- 시퀀스 컨테이너, 연관 컨테이너, 어댑터 컨테이너

반복자 (Iterator)

- 컨테이너에 저장된 데이터를 순회하는 과정을 일반화한 표현

- 컨테이너 내부의 데이터를 순회할 수 있는 객체

- 컨테이너의 특정 위치를 나타낸다

알고리즘 (Algorithm)

- 정렬, 삭제, 연산 등을 해결하는 일반화된 방법을 제공하는 함수 템플릿

- 컨테이너 객체의 원소를 다루기 위한 여러가지 알고리즘

함수자(functor) or 함수 객체(function object)

- operator() 연산자를 오버로딩한 클래스 객체

- 함수처럼 동작하는 객체

- 함수를 호출하듯 객체를 호출할 수 있다.

 

컨테이너 종류
1. 순차 컨테이너(시퀀스 컨테이너)
- vector, list, deque 등등
- 임의의 위치에 삽입,삭제 가능
- 데이터를 순차적 저장
- 저장, 검색, 알고리즘에 불리
- 적은 데이터에 사용
- 느린 검색
2. 연관 컨테이너
- set, map, multiset, multimap 등
- 일정한 규칙에 따라 데이터를 저장
- 검색에 유리
- 많은 양의 데이터에 사용
- 빠른 검색
3. 어뎁터 컨테이너
- stack, queue, priority_queue
- 데이터를 정해진 방식에 따라 저장
- 기존 컨터이너의 기능을 제한하거나 변형한 컨테이너
- 반복자를 지원하지 않음

 

'프로그래밍 공부 > STL' 카테고리의 다른 글

문자열 처리함수 c_str()  (0) 2022.02.27
C++ STL set & multiset  (0) 2022.02.17
C++ STL deque란?  (0) 2022.02.17
C++ STL list 란?  (0) 2022.02.15
STL vector 란?  (0) 2022.02.13

C++98/03, C++11/14 와 같이

98년도에 표준화 03년도에 추가, 수정

11년도에 표준화 14년도에 추가, 수정 과 같이 

여러 최신 기능들을 추가하고 수정하여 표준화하는데

C++11/14 부터 mordern C++ 이라고 부른다.

 

안정성과 성능향상 등의 장점이 있고

 

- 스마트 포인터

- auto

- Ranged-vased for 반복자

- constexpr

- r-value / move

- Lambda

등등을 사용

 

'프로그래밍 공부 > modern C++' 카테고리의 다른 글

modern C++ 범위 기반 for문 (rage-based for statement)  (0) 2022.02.18
auto  (0) 2022.02.17
스마트 포인터 weak_ptr  (0) 2022.02.17
스마트 포인터 shared_ptr  (0) 2022.02.15
스마트 포인터란? && unique_ptr  (0) 2022.02.13

C++ 에서 구조체와 클래스의 차이

 

접근 지시자의 차이

구조체 (struct) 의 경우

기본적인 접근 지정자가 public 이고

 

클래스 (class) 의 경우

기본적인 접근 지정자가 private 이다.

 

그 이외의 기능들은 c++에서는 동일하게 사용가능하다.

(함수선언 정의, 생성자 소멸자, 상속 등등)

 

C# 에서 구조체와 클래스의 차이

 

타입의 차이

구조체(struct)의 경우

스택 메모리에 생성 되고

 

클래스(class)의 경우

힙 메모리에 생성된다.

 

구조체는 스택에 할당되어 가비지컬렉션이 발생하지않고

클래스는 힙에 할당되어 가비지지컬렉션이 발생하므로 속도면에서 구조체가 유리하며

크기가 클 경우 클래스는 주소 값만 저장하는 반면 

구조체는 스택에 모두 저장하기 때문에 스택 오버플로우가 발생할 수 있다.

'프로그래밍 공부 > 궁금한 정보들' 카테고리의 다른 글

용어 정리  (0) 2022.02.17
if(!) if문 안에 !의 의미  (0) 2022.02.14
문자열 _T 매크로, C++ 리터럴이란  (0) 2018.01.04
가변인자 함수  (0) 2018.01.03
동적 메모리 할당  (0) 2016.02.18

_T 매크로


사용 방법

_T("문자열"); 

 

의미

_UNICODE가 define 되어 있으면 L"문자열" 리턴

_UNICODE가 define 되어 있지 않으면 "문자열" 리턴


참고

- 문자열 앞에 L 이 있으면 유니코드 형태로 인식

- _T 대신 _TEXT 사용 가능



C++ 리터럴 (Literal)


의미

- 특정한 메모리공간에 이름 없이 임시적으로 저장되어있는 값을 의미

- 상수

예시

#include<iostream>

using namespace std;

int main()

{

char chresult       = 0;

int   intresult       = 0;

char arrresult[12] = "Hello World";


chresult      "H" ;  

intresult      1 + 2 ;


return 0;

}

예시에서 리터럴 상수

문자 리터럴 상수    : H

정수 리터럴 상수    : 1, 2

문자열 리터럴 상수 : Hello World




'프로그래밍 공부 > 궁금한 정보들' 카테고리의 다른 글

if(!) if문 안에 !의 의미  (0) 2022.02.14
C++ 구조체와 클래스 차이  (0) 2022.02.04
가변인자 함수  (0) 2018.01.03
동적 메모리 할당  (0) 2016.02.18
포인터 (pointer)  (0) 2015.07.25

+ Recent posts