반응형

cpp Vector 2


+ vector의 element 탐색

-std::vector::begin

첫번째 엘리먼트를 가리키는 이터레이터를 리턴한다.

컨테이너가 empty이면 리턴값은 dereference할 수 없다.

-std::vector::end

마지막을 지난 엘리먼트의 위치를 가리키는 이터레이터를 리턴한다.

past-the-end 엘리먼트는 벡터의 마지막 엘리먼트 뒤의 이론적 엘리먼트다. 따라서 dereference할 수 없다.

컨테이너가 empty이면 리턴값은 vector::begin의 리턴값과 같다.


ex)

std::vector<int> my ;

for (int i=1; i<=5; i++) my.push_back(i) ;

for(std::vector<int>::iterator it=my.begin(); it!=my.end(); ++it) 

   std::cout << " " << *it ;

my vector의 모든 엘리먼트 탐색하여 출력. 1,2,3,4,5


+ 역방향 탐색

vector::rbegin()    ,   vector::rend()

int i=0 ;

std::vector<int> my(5) ; 

std::vector<int>::reverse_iterator rit = my.rbegin() ;

for (; rit!=my.rend(); ++rit)  *rit = ++i ;

출력하면 5,4,3,2,1 을 갖는다.


+첫번째 값, 마지막 값

vector::front()    , vector::back()

begin(), end()는 iterator로 위치를 의미하지만, front(), back()은 위치가 아니라 엘리먼트의 값을 참조로 리턴한다.

std::vector<int> my ;

my.push_back(50) ;

my.push_back(20) ;

my.front() -= my.back() ;    // 첫번째 엘리먼트에 첫번째 - 마지막 값으로 할당한다.

std::cout << my.front() << std::endl ;

첫번째 값이 30으로 변경되어 30이 출력된다.


std::vector<int> my ;

my.push_back(10) ;

while ( my.back()!=0 ) my.push_back(  my.back() -1 ) ;

출력하면 10, 9, 8, ..., 2, 1, 0


+const iterator

vector::cbegin()        vector::cend()

vector::crbegin()        vector::crend()

begin(), end()와의 차이점은 리턴값이 const_iterator 로써 iterator를 통한 엘리먼트의 값을 변경할 수 없다. (*it=value --> compile error)

+data

value_type *data()

첫번째 엘리먼트 배열 메모리의 포인터를 리턴한다.  벡터는 엘리먼트들이 연속적인 메모리에 위치되도록 보장한다. 따라서 주소로 접근 가능.

std::vector<int> my(5) ;

int *p = my.data() ;

*p=10 ;

p++ ;

*p=20 ;

p[2]=40 ;

출력하면 10, 20, 0, 40, 0


+ [] operator

벡터의 n번째 위치의 엘리먼트를 참조로 리턴한다.

my[i] 이렇게 배열처럼  읽고 쓰기가 사용가능.




 



'Develop > C&CPP' 카테고리의 다른 글

Array 1  (1) 2018.05.25
Vector 3  (0) 2018.05.23
Vector 1  (0) 2018.05.16
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
gdb로 디버깅하기  (0) 2018.03.06
반응형

cpp의 vector (std::vector)


크기를 변경할 수 있는 배열로 표현된 컨테이너

배열처럼 인덱스로 접근이 가능.

배열과 다르게 동적으로 크기 변화가 되며 메모리가 자동으로 관리

엘리먼트들의 순서가 있는 컨테이너. 엘리먼트의 위치 인덱스로 접근

#include <vector>


+초기화

std::vector<int> a1;    // 빈 객체

std::vector<int> a2(4, 100) ; // 100의 값을 갖는 엘리먼트들을 4개만들어 초기화.

std::vector<int> a3(a2.begin(), a2.end());  // a2의 이터레이터를 통한 복사.

std::vector<int> a4(a3) ;     // a3 복사

 

-배열을 복사

int array1={1,2,3,4,5} ;

std::vector<int> a5(array1, array1+sizeof(array1)/sizeof(int)) ;  // 두 번째 파라미터는 배열의 마지막 노드의 다음 노드의 포인터.

-출력/탐색

for(std::vector<int>::iterator it = a5.begin(); it!=a5.end(); it++)

    std::cout << " " << *it ;    // *it ; 이터레이터가 가리키는 엘리먼트의 값.(int)

=>  a5.end()는 a5의 마지막 노드의 위치 다음으로 끝을 가리키는 위치로 볼 수 있다. 따라서 위에서 마지막까지 빠짐없이 전체의 값을 출력할 수 있다.


+ 복사

= operator : 다른 컨테이너의 내용을 기존 내용에 덮어쓴다. (크기도 수정됨.)

std::vector<int> a1(3, 0) ;

std::vector<int> a2(5, 0) ;

a2 = a1 ;

a1=std::vector<int>();

a2의 크기는 5에서 3으로 변경되고, 기존 a1의 elements들로 바뀜.

a1은 다시 초기화하여 empty가 된다.


+할당

assign()

std::vector<int> a1, a2, a3 ;

a1.assign(5, 1) ;    // 5개의 노드를 만들고, 전부 1로 초기화.

std::vector<int>::iterator it = a1.begin()+1 ;    // a1의 두 번째를 가리킴.

a2.assign( it, a1.end()-1 ) ; //위의 이터레이터 부터 a1의 끝 하나 전까지 a2로 할당(복사). a1에서 앞, 뒤 하나씩뺀 3개가 복사됨.

a3.assign( arr1, arr1+3 ) ;   // arr1 배열에서 3개를 복사.


+벡터 크기와 크기 변경.

-벡터의 크기.

a1.size();   // 엘리먼트의 개수를 리턴함.

-벡터의 용량

a1.capacity();    // 메모리가 할당된 크기. (엘리먼트 크기 단위)

capacity는 size와 다를 수 있다. 실제 데이터 크기보다 메모리를 reserve로 더 많이 할당될 수도 있다.  (  size <= capacity )

벡터는 데이터 추가시에 알아사 자동으로 메모리가 확장되기 때문에 할당문제를 고려할 필요가 없지만 성능상 미리 메모리 할당이 필요한 경우 reserve()를 통해 최대로 받을 아이템 개수를 파라미터로 설정해 두는 것도 좋다.


-벡터 크기 변경

void resize(size_type n ) ;

void resize(size_type n , const value_type &val) ;

벡터의 크기를 n으로 변경. 현재 컨테이너 크기보다 작게 설정하면, n개의 엘리먼트까지만 유효하다. (나머지는 삭제).

현재 컨테이너 크기보다 크게 설정하면, 기존 데이터를 유지하고 크기가 확장. val값을 지정하면 해당 값으로 채운다.

현재의 capacity보다도 크면, 알아서 메모리 할당까지 해준다.

std::vector<int> a1 ;

for(i=0 i<10; i++) a1.push_back(i) ;    // 0~9까지 10개의 노드 추가.

a1.resize(5);    // 크기를 5로 지정. 데이터는 0~4까지만 존재.

a1.resize(8, 10);    //크기를 8로 확장. 뒤에 3개의 공간이 더 생기고 10으로 초기화됨.

a1.resize(12);     // 크기를 12로 확장. 뒤에 4개의 공간이 더 생기고 빈 값(0으로 초기화).

a1 전체 출력

for (int i=0; i<a1.size(); i++) std::cout << " " <<a1[i] ;

0 1 2 3 4 10 10 10 0 0 0 0 








'Develop > C&CPP' 카테고리의 다른 글

Vector 3  (0) 2018.05.23
Vector 2  (1) 2018.05.18
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
gdb로 디버깅하기  (0) 2018.03.06
mutex 동기화 예제  (1) 2018.03.06
반응형

HTML 파싱하여 원하는 부분 추출하기.


+ Beautifulsoup 설치

pip install beautifulsoup4
버전 4


+ URL로 HTML 가져와서파싱하기
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup

url="http://www.naver.com/"
html = urlopen(url).read()

soup = BeautifulSoup(html, 'html.parser')

rank = soup.find("dl", id="ranklist")     # dl tag, id=ranklist search.

for i in rank.find_all("li", value=True, id=False):          # li tag, value exist, id no exist. search
     print( i.get_text(" ", strip=True) )  # 문자열을 가져오는데, 태그는 공백으로 두고, 앞뒤 공백 제거.


+헤더 추가
req = Request(url)
req.add_header('User-Agent', 'Mozilla/5.0')
html = urlopen(req).read()



+BeautifulSoup html 서치.

-모든 태그 검색
html_as=soup.find_all("a")     # 모든 a 태그 검색. 접근시 html_as[0], [1], .. 첫번째가 0인덱스.
soup("a")     # 상동

-스트링이 있는 title 태그 모두 검색
soup.title.find_all(string=True)
soup.title(string=True)

-a태그 두 개만 가져옴.
soup.find_all("a", limit=2)

-스트링 검색
soup.find_all(string="elsie")   해당 스트링 검색
 or검색을 하려면 array 로 입력 ["aa", "bb"]
 정규식을 쓰려면 re.compile("정규식")

-태그와 속성(클래스)값으로 검색
soup.find_all("p", "title")
soup.select('p[class="title"]')
ex) <p class="title"></p>

-태그와 태그 사이 찾기
soup.find_all(["a", "b"])

-속성(클래스)값 가져오기
soup.p['class']
soup.p['id']

-보기 좋게 출력
soup.b.prettify()


-검색
soup.body.b     각 첫번째 노드
soup.a     # 처음으로 나오는 a태그

-태그와 클래스명 검색
soup.find_all("a", class_="sister")     # class_ 를 사용. 예약어라서 _를 사용.

-태그와 ID로 찾기
soup.find("div", id="articlebody")
soup.find("div", { "id":"articlebody" } )
soup.find(id="articlebody")

soup.select("#articlebody") ; id로 검색.
soup.select("div#articlebody") ; 태그와 id로 검색.

-태그와 클래스로 찾기 
soup.select('div ol[class="list1"]')

find_all 이나 select는 array로 리턴. 복수개!
하나만 찾을 때는 find 사용.


-검색결과 없으면 None

-태그의 이름 얻기
soup.find("div").name

-속성 얻기
soup.find("div")['class']          없으면 에러
soup.find("div").get('class')     없으면 None


-태그 사이에 있는 중간의 텍스트 얻기
contents 속성 사용.
<p> aaa
<b> one </b>
cc
</p>

soup.b.string          ==> one
soup.b.contents[0]     ==> one

soup.p.contents     ==> aaa, <b>one</b>, cc
     원하는 원소 인덱스를 사용.

-다음 형제 태그
soup.p.next_sibling

-태그 내부 추적 검색
ptag = soup.p
ptag('table')[0]('tr')[0]('td')[0]

-태그 사이 텍스트 전체 
ptag.get_text()




+ HTML 파일에서 읽기
import codecs

page_html = codecs.open('a.html''r''utf-8')
page_soup = soup(page_html, "html.parser")

+태그 추적하기 
예)

// span 태그의 아이디로 먼저 검색하고, 자식중에 2번째 table 태그를 찾음.
testwebsite_container = page_soup.find("span"id="MainContent2_ctl00_lblContent").findAll("table")[1]

skiptrcnt=1 # skip first tr block
for i,record in enumerate(testwebsite_container.findAll('tr')):    # 모든 tr태그를 검색.
    if skiptrcnt>i:
        continue
    # 처음 n개는 스킵한다.
tnum = record('td')[0].text        # 첫 번째 td의 텍스트
desc = record('td')[1].text
doclink = record('td')[2].text    #세번째 td의 텍스트 (a link의 보이는 링크명으로 보이는 부분이 나옴.)
alink = record('td')[2].find("a")       # 세번째  td에서 하위에 a태그를 찾음.
if alink :
    doclinkurl=testwebsite+alink['href'   # 속성! href의 값을 가져온다. 
closingdate = record('td')[3].text

detail = record('td')[4].text            # td태그 내부에 br태그가 있으면 줄바뀜이 생김.
detail = detail.replace('\n''')        # 줄바뀜 제거. 











'Python' 카테고리의 다른 글

File I/O, Directory list, read/write  (0) 2018.07.04
WebAPI thread work status  (0) 2018.07.03
Python 데이터 저장/로딩 Pickle  (0) 2018.04.25
Python 커맨드라인 파싱  (0) 2018.04.17
Python 쉘 커맨드 실행  (0) 2018.04.12

+ Recent posts