C++ STL list의 삽입과 삭제에 대해서 간단히 정리하고자 한다.


STL list .insert(iterator, 넣을 값)



L = { A, B, C }



연결리스트는 A->B->C 와 같이 구성되어 있는 것이지만 표기의 편의성을 위해 위와 같이 표기하였다.



위와 같은 연결리스트가 있고, 현재 iterator의 위치가 B라면, L.insert(iterator, 'K') 라는 코드를 실행하게 되면 결과는 다음과 같다.


{A, K, B, C}



iterator의 왼편에 새로운 값이 삽입이 되고, iterator는 원래 가르키던 값을 가르킨다고 생각하면 된다. 

( 이해의 편의를 위해서 이렇게 적었다)


그리고, insert 함수의 경우 아무 것도 반환하지 않는다.






다음으로는 삭제에 대해서 알아보자.


Iterator = list.erase(Iterator)


erase 함수는 삭제를 수행한 이후에 iterator를 반환한다. 따라서 반드시 반환되는 iterator을 받아서 갱신(저장)하는 방식으로 구현해줘야 한다.


L = { A, B, C }


위와 동일한 상황이고, 현재 iterator가 B를 가르키고 있는 상태에서, 


itr = list.erase(itr)


다음과 같은 구문을 실행하게 되면, L = {A, } 이와 같은 상황이 되고, iterator는 없어진 B의 우측에 있던 값인 C를 가르킨다고 생각할 수 있다.

'Programming Language > C++' 카테고리의 다른 글

vector upper_bound, lower_bound 사용 (C++)  (0) 2019.09.01
string 대소문자 변환  (0) 2019.08.25
priority_queue  (0) 2019.08.14
(C++) abs 함수의 사용  (0) 2019.08.07
(C++) list STL 출력 및 iterator  (0) 2019.08.04

배열에서, 특정 원소의 개수를 파악하는 것을 upper_bound 그리고 lower_bound를 활용해서 할 수 있다.


1
2
3
4
5
6
7
8
9
10
sort(x.begin(), x.end());
 
    vector<ll>::iterator low, high;
    for (int i = 0; i < x.size(); i++) {
        if (mp.find(x[i]) == mp.end()) {
            low = lower_bound(x.begin(), x.end(), x[i]);
            high = upper_bound(x.begin(), x.end(), x[i]);
            mp.insert({ x[i], high - low });
        }
    }
cs



당연하게도 두 bound의 특징을 활용해서 특정 원소의 개수를 파악하기 위해서는 정렬이 필수적이다.


 코드의 경우, low에는 처음으로 벡터의 원소가 x[i] 이상이 되는 원소의 iterator가 반환되고,


high에는 벡터의 원소중, 처음으로 x[i] 초과가 되는 원소의 iterator가 저장된다.



이때 high 혹은 low에서 x.begin()을 빼주면 몇번째 위치인지를 파악할 수 있는 것이고,


이 과정을 생략하고 high와 low의 차이를 구하면, 두 iterator의 위치 차이를 구할 수 있기 때문에, x[i]의 개수가 구해지는 것이다.



'Programming Language > C++' 카테고리의 다른 글

STL list insert, erase (C++)  (1) 2019.09.02
string 대소문자 변환  (0) 2019.08.25
priority_queue  (0) 2019.08.14
(C++) abs 함수의 사용  (0) 2019.08.07
(C++) list STL 출력 및 iterator  (0) 2019.08.04

파이썬의 bs4 그리고 requests를 활용해서 크롤링을 할 때에, 한글 인코딩 문제로 아래와 같은 에러가 발생할 수 있다.



본인은 conda 가상 환경에서 python 3.6 버전을 이용해서 cgv의 상영 시간표를 크롤링하다가 이러한 에러를 만났다.



UnicodeEncodeError: 'cp949' codec can't encode character '\xa0' in position 162673: illegal multibyte sequence



인코딩과 관련된 문제는 대부분 한글과 관련해서 발생하는 문제이다.



코드 상단에 아래와 같은 코드를 추가해주면 해결할 수 있다.


1
2
3
4
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')

cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#implementation of simple GUI program
from tkinter import *
 
def printHello():
    print('Hi!')
 
#root = tkinter.TK()
window=Tk()
w=Label(window, text = "Python Test")
b=Button(window, text = "Hello Python", command = printHello) #if clicked, run printHello function
c=Button(window, text = "Quit", command = window.quit) #if clicked, quit
 
w.pack()
b.pack()
c.pack()
 
window.mainloop()
 
cs

python test라는 버튼을 누르면 콘솔창에 hi를 출력하고, quit을 누르면 종료하는 기본적인 GUI 프로그램 구현 코드이다

기본적인 데이터 타입과 자료형에 관해서 간략히 정리하고자 한다.


정말 기본적인 특성도 이 글에서 함께 정리하려고 한다.




1. 먼저 변수란 데이터를 참조하기 위해 메모리 주소를 대신하는 별명 정도로 이해하면 된다.



2.python에서는 문자와 문자열을 구분하지 않는다. str 형으로 통합되어 있다.



3. 정수를 사용할 경우, c++에서는 int형은 약 +-21억 정도 사용할 수 있었던 것으로 기억하는데


파이썬의 경우 메모리가 허용하는만큼 수를 크게 사용할 수 있다.




4. 하지만 실수의 경우에는 8바이트 선에서 표현된다.



5. 형변환을 할 때에는 int(str형) 과 같은 방식으로 한다.



6. C++에서 처럼 나눗셈 연산을 할 때 기본적으로 버림을 하지 않는다. 몫만 구하는 연산자가 // 로 정의되어 있다.



7. .format을 활용한 출력은 아래 코드에 정리되어 있다.


1
2
3
dic = {1:"a"2"b"3"C"}
for i in dic:
    print('{0}value : {1}'.format(i, dic[i]))
cs

이런식으로 쓰기도 가능



8. else if를 의미하는 것이 elif



9. range(0, 10, 1) 0부터 시작해서 10보다 작을동안 1씩 증가하면서




아래로는 컨테이너 자료형에 대한 정리이다.



1. 튜플은 리스트와 비슷하다. 차이점은 튜플은 데이터를 수정할 수 없다는 것이다.


길이를 구하고, 튜플끼리 결합하고, 슬라이싱, 인덱스를 활용한 접근, 특정 데이터가 몇 개 있는지 확인 등은 모두 가능하다



2. 딕셔너리: {}로 표현되고, key value 페어로 데이터가 관리된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
str = "123"
num = 456
str2 = int(str#문자를 숫자로 변환
print(str2 + num)
 
myList = ['abc'123, True, 3.14"A"]
print(len(myList)) #길이를 확인
 
myList.append('newData')
print(myList)
myList.append('newData'#중복도 가능
print(myList)
 
myList.pop() #가장 마지막 데이터 pop된다
print(myList)
 
myList.pop(0#인덱스가 0인 데이터 삭제
print(myList)
 
#list에 다른 list를 이어 붙이고 싶은 경우
myList.extend(['n1''n2'])
print(myList)
 
#특정 위치에 인덱스 삽입
myList.insert(3'insterted')
print(myList)
 
#특정 원소 삭제
myList.remove('A')
print(myList)
 
#전체 삭제할 때는
myList.clear()
print(myList)
 
#정렬하고 싶다. 이 때 숫자와 문자가 섞여있으면 정렬할 수 없다.
nlist = [1423]
nlist.sort(reverse = True) #이러면 내림차순. default는 false로 내림차순
print(nlist)
 
#역순으로 뒤집고 싶다
nlist = [1423]
nlist.reverse()
print(nlist)
 
#슬라이싱 slicing
#시작점~ 마지막값 인덱스 +1
sliced = nlist[1:2#맨앞에 생략되면 처음부터
print(sliced)
 
#튜플 : 리스트랑 비슷한데, 소괄호를 이용하고 데이터의 수정이 불가능
 
#dictionary
dic = {'1'"as"'3'"adad"'4'"akkkkk"}
del dic['1']
print(dic)
 
print('A' < 'a'#소문자의 아스키 값이 더 크다
 
 
# dictionary 출력
 
for i in dic:
    print(i)
    print(dic[i])
 
dic = {1:"a"2"b"3"C"}
for i in dic:
    print('{0}value : {1}'.format(i, dic[i]))
 
for i in range(2101):
    print(i, "단")
    for j in range(1101):
        print('{0} X {1} = {2}'.format(i, j, i*j))
 
for i in range(10):
    print(i)
 
 
cs


1. std::transform을 쓰는 방법

#include <algorithm>
#include <string>

std::string str = "Hello World";
std::transform(str.begin(), str.end(),str.begin(), ::toupper);

범위에 있는 모든 원소에 대해 function을 수행한 결과를 다른 범위에 저장

toupper 혹은 tolower 앞에 :: 꼭 붙어야한다.

원형은

template< class InputIt, class OutputIt, class UnaryOperation >
OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first,
                    UnaryOperation unary_op );

//또는

template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation >
OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2, 
                    OutputIt d_first, BinaryOperation binary_op );


파라미터

  • first1last1 : transform 할 첫 번째 원소
  • first2 : transform 할 2번째 범위의 첫 번째 원소
  • d_first : transform 결과를 저장할 범위의 첫 번째 위치
  • unary_op : 객체를 바꾸는 unary 함수
  • bianry_op : 객체를 바꾸는 binary함수


'Programming Language > C++' 카테고리의 다른 글

STL list insert, erase (C++)  (1) 2019.09.02
vector upper_bound, lower_bound 사용 (C++)  (0) 2019.09.01
priority_queue  (0) 2019.08.14
(C++) abs 함수의 사용  (0) 2019.08.07
(C++) list STL 출력 및 iterator  (0) 2019.08.04

기본이 max이고 less<>라고 외우면 되겠다.


greater 을 사용하려면 functional 헤더를 인클루드 시켜줘야한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cstdio>
#include <queue>
using namespace std;
 
struct a{
    int start;
    int en;
    int value;
};
 
bool operator<(a t, a u){
    return t.value < u.value;
}
 
priority_queue<a> pq;
 

cs



구조체와 함께 사용한다면 위와 같이 < 연산자를 오버로딩해서 사용하는데, value가 큰 것부터 나온다.


value가 작은 것부터 나오게 하려면, 12번째 줄의 <를 >로 바꿔주면 된다.



'Programming Language > C++' 카테고리의 다른 글

vector upper_bound, lower_bound 사용 (C++)  (0) 2019.09.01
string 대소문자 변환  (0) 2019.08.25
(C++) abs 함수의 사용  (0) 2019.08.07
(C++) list STL 출력 및 iterator  (0) 2019.08.04
next_permutation  (0) 2019.07.21

기본적으로 #include<cstdlib> 헤더를 포함시켜서 사용한다.


floating type에 대해서는 cmath 헤더에도 오버로딩 되어있다고 한다.



'Programming Language > C++' 카테고리의 다른 글

string 대소문자 변환  (0) 2019.08.25
priority_queue  (0) 2019.08.14
(C++) list STL 출력 및 iterator  (0) 2019.08.04
next_permutation  (0) 2019.07.21
vector reverse  (0) 2019.07.04

간단하게 auto를 사용하지 않고, iterator를 선언하는 방법과, 이를 이용해서 출력하는 것을 코드로 나타내었다.

 

내용은 향후에 추가될 예정이다.

 

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

int main(void) {

	list<int> L = { 1, 2 };
	list<int>::iterator it = L.begin(); //iterator를 포인터라고 생각하면 편하다
	
	cout << *it << '\n';
	L.push_back(3);
	it++;
	it++; //한칸씩 움직인다
	cout << *it << '\n'; //3을 가리킴

	//여기까지 1,2,3

	L.insert(it, 10); //it는 3 가리키고있었는데 왼쪽에 10이 추가됨. it는 여전히 3 가리킴

	L.insert(it, 15); //3가리키는 it왼쪽에 15추가

					  //전체 리스트 출력
	for (list<int>::iterator itor = L.begin(); itor != L.end(); itor++) {
		cout << *itor << ' ';
	}
	
	cout <<'\n' << *it << '\n';

	it = L.erase(it);
	it--;

	
	for (list<int>::iterator itor = L.begin(); itor != L.end(); itor++) {
		cout << *itor << ' ';
	}

	cout << '\n' << *it << '\n';

	it = L.end(); // 리스트의 끝보다 한칸 더 오른쪽의 값을 가리킨다
	it--; //그러니까 하나 당겨주고 
	cout << '\n' << *it << '\n'; //출력해야 마지막 값이 나온다

	it = L.begin();
	cout << '\n' << *it << '\n'; //처음 값
	return 0;
}

 

'Programming Language > C++' 카테고리의 다른 글

string 대소문자 변환  (0) 2019.08.25
priority_queue  (0) 2019.08.14
(C++) abs 함수의 사용  (0) 2019.08.07
next_permutation  (0) 2019.07.21
vector reverse  (0) 2019.07.04

가령 X & Y 라는 수식이 있다고 하자. 이 때 &자리에는 | 그리고 ^도 올 수 있다.

 

순서대로 and, or, xor을 의미한다.

 

X와 Y를 이진수로 바꾸고, 각 자릿수의 비트를 해당 연산자에 맞게 연산해서 그 결과를 반환해준다.

 

일반 연산보다 연산 속도가 빠르다.

 

가령 2 & 3을 계산한다고 하면, 2는 이진수로 0000010, 3은 00000011이다.

 

왼쪽의 6자리 0끼리는 and 연산해봐야 0이므로 놔두고, 1 & 1 = 1, 0 & 1 = 0이기 때문에, 연산의 결과는

 

00000010 = 십진수로 2라고 할 수 있다.

'Programming Language > Java' 카테고리의 다른 글

조건(삼항) 연산자  (0) 2019.07.27
서식 문자의 사용  (0) 2019.07.27

+ Recent posts