반응형

+감사로그에서 초 단위로 발생한 로그 개수 조회.

mysql

LOG_DATE 형식 VARCHAR2로 yyyy-mm-dd hh:mm:ss.sss

LOG_DATE에서 처음부터 19자까지만 얻어와서 그룹별로 카운팅.

카운트로 내림차순으로 정렬.


select * from (

select substr(LOG_DATE, 1, 19) as d, count(*) as cnt from AUDIT_LOG group by substr(LOG_DATE, 1, 19) ) A

order by cnt desc ;



반응형

cpp string

#include <string>


+초기화

std::string s0("initial string") ;

std::string s1 ;

std::string s2(s0) ;

std::string s3(s0, 8, 3) ;    // index 8에서 3글자. => str

std::string s6(10, 'x') ;    // xxxxxxxxxx

std::string s7b(s0.begin(), s0.begin()+7) ;   // initial


+이터레이터 ; begin(), end(), rbegin(), rend(), c*


+용량

size() ; 스트링 길이 (char 수)

length() ; 스트링 길이

reserve(size_type n) ; capacity 변경. 기존 길이보다 작게 설정하면 작동하지 않는다. 기존 스트링의 내용이나 길이를 변경하지는 않는다. 

resize(size_type n) ; 크기 리사이즈. 스트링 길이보다 작으면 해당 길이로 줄어들고, 스트링 길이보다 크면, 나머지 부분에는 디폴트로 null 이 채워지고, 특정 문자로 지정하면 해당 문자들이 채워진다.

capacity() ; 메모리 할당 크기. 스트링 길이 이상이며  스트링 길이와 같지 않을 수 있다. (보통 더 크다.)

clear() ; 내용 모두 삭제. 길이가 0으로 된다. 

empty() ; empty check. 스트링 길이가 0이면 true, 아니면 false.


+c_str()

null terminated 문자열 시작 주소를 리턴한다. 

std::string str("hello world") ;

char *cstr = new char[str.length()+1] ;

std::strcpy(cstr, str.c_str()) ;

delete [] cstr ;


+data()

c_str() 과 동일


+[] operator ; char array index로 접근


+copy()

현재 스트링의 일부를 목적지 주소로 복사한다.  리턴값은 복사된 길이.

copy(charT *s, size_type len, sizt_type pos=0) ;

char buf[20] ;

std::string str("Test string...") ;

std::size_type len = str.copy(buf, 6, 5) ;    // str의 index 5부터 6개를 복사.

buf[len]='\0' ;    // null add.

buf -> "string"


+substr() ; 문자열 일부를 복사하여 얻어온다.

문자열 일부를 새로운 string객체로 만들어 리턴한다.

substr(size_type pos=0, size_type len=npos) ;  // 시작 위치, 길이

길이를 생략하면 끝까지 복사.

std::string str2 = str.substr(12, 12) ;    // index 12에서 12문자 복사.

std::string::size_type pos = str.find("live") ;    // live 문자열 시작 위치 인덱스.

std::string str3 = str.substr(pos) ;    // live부터 끝까지 복사된 객체 생성.


+replace() ; 문자열의 일부를 변경한다.

replace(시작위치, 길이, 대체할 문자열) ; 시작위치부터 해당 길이 부분을 대체한다.

시작위치, 길이를 이터레이터로 대체할 수 있다.

replace(시작위치, 길이, 대체할 문자열, 대체문자열의 시작위치, 대체문자열의 길이)  ; 대체문자열에서 일부를 잘라 그것으로 교체한다.

replace(pos, len, char *)

replace(i1, i2, char*)

replace(pos, len, size_type n , charT c) ;  // 대체할 문자열을 지정한 문자 n개로 한다.

replace(i1, i2, first, last) ;    // 모두 이터레이터로 파라미터를 제공.


+append() ; 문자열 추가

append(string& str) ;

append(string &, subpos, sublen) ; // 추가할 문자열의 일부분 지정 가능 (시작위치, 길이)

append(char* )

append(char *, n) ;

append( n, char) 

append(first, last)   // 이터레이터로 추가할 문자열 범위 지정.

+= operator를 사용하여 추가도 가능하다. 

+= operator는 파라미터로 string, char*, char 가능.

std::string name("John") ;

std::string family("smith") ;

name+=" K. " ;

name+=family ;

name+='\n' ;


+find(needle, start, length)

문자열 검색하여 처음 발견된 위치를 리턴. pos 위치 지정하면 해당 위치부터 검색.

없으면 std::string::npos 리턴

std::string::size_type f = str.find(str2) ;    // str에서 str2가 처음 발견된 index 리턴.

f=str.find(str2, f+1)    // 위에서 발견한 다음 인덱스부터 검색.

f=str.find(str2, f+1, n)    // 위에서 발견한 다음 인덱스부터 검색하는데 str2의 n길이 만큼만 비교.


+rfind()

뒤에서 부터 검색.

뒤에서 부터 검색해서 sixth를 찾아 seventh로 변경

std::string key("sixth") ;

std::string::size_type f = str.rfind(key) ;

if (f!=std::string::npos) 

    str.replace(f, key.length(), "seventh") ;


+find_first_of() 

문자열 중에 아무거나 먼저 발견된 곳을 찾는다.

f=str.find_first_of("aeiou") ;    // 앞에서 부터 먼저 나온 모음 위치 인덱스를 리턴.

f=str.find_first_of("aeiou", f+1) ; // 발견된 다음 위치부터 다시 검색.

find_last_of()

find_first_not_of()

find_last_not_of()












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

numeric: accumulate, adjacent_difference, inner_product, partial_sum  (0) 2018.06.01
string function  (0) 2018.05.31
map  (0) 2018.05.29
List 1  (0) 2018.05.28
Array 1  (0) 2018.05.25
반응형

cpp map

키, 값의 쌍으로 구성된 연관 컨테이너.

#include <map>


+constructor

std::map<char, int> first ;

first['a']=10 ;

first['b']=30 ;

first['c'] = 50 ;

std::map<char,int> second (first.begin(), first.end() ) ;

std::map<char,int> thrid (second) ;


std::map<char, int, classcomp> fourth ;

struct classcomp {

 bool operator() (const char&lhs, const char& rhs) const {  return lhs<rhs ; }

} ;


+일반적인 함수

begin(), end(), cbegin, cend, rbegin, rend, crbegin, crend, size(), clear(), empty() 


+at()

키값으로  요소를 찾아 값을 참조로 반환한다. []와 다르게 키가 없으면 익셉션(out_of_range) 발생.

std::map<std::string, int> mymap = { {"alpha", 0}, {"beta", 0}, {"gamma", 0} } ;

mymap.at("alpha") = 10 ;

mymap.at("beta") = 20 ;

mymap.at("gamma")=30 ;

mymap["alpha"]=40 ;


+count()

키 값이 일치하는 요소의 개수를 리턴한다. 따라서 0 또는 1만 리턴된다. 

mymap.count( "alpha" )    ; 해당 키가 존재하면 1, 없으면 0


+emplace()  (C++11)

새로운 요소를 맵에 추가한다. 중복된 키가 존재하면 추가나 업데이트가 되지 않는다. 

std::map<char,int> map1 ;

map1.emplace('x', 100) ;

map1.emplace('y', 200) ;

for (auto x : map1 ) {

std::cout << x.first << ' ' << x.second << std::endl ;

}

+insert()

map1.insert( std::pair<char,int>('a', 100) ) ;


+find()

키로 이터레이터를 찾는다.

std::map<char,int>::iterator it ;

it = map1.find('b') ;

if ( it!= map1.end() ) map1.erase(it) ;    // 키 'b'를 찾아 요소를 삭제한다.


+lower_bound, upper_bound

키로 범위를 정할 때 사용.

키가 a,b,c,d,e 가 있을 때

b~d까지의 범위

itlow = map1.lower_bound('b') ;    // point to 'b'

itup = map1.upper_bound('d') ;    // point to 'e' 주의!

map1.erase(itlow, itup) ;    // 'b'~'d'까지 삭제함. 

남은 요소는 a, e

+erase() ; 요소 삭제

erase(const_iterator pos) ;

erase(const key_type &k) ;

erase(const_iterator first, last) ;








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

string function  (0) 2018.05.31
string  (0) 2018.05.30
List 1  (0) 2018.05.28
Array 1  (0) 2018.05.25
Vector 3  (0) 2018.05.23
반응형

cpp list class

리스트는 순서있는 컨테이너. 어느 위치라도 추가/삭제가 용이함. 더블 링크드 리스트로 구현.

#include <list>


+constructor

-empty container constructor

list(const allocator_type& alloc=allocator_type()) ;

-fill constructor

list(size_type n, const value_type& val, const allocator_type& alloc =allocator_type())

-range constructor

list(inputiterator first, last, alloc=allocator_type()) ;

-copy const.

list(const list& x, alloc=null) ;

-move const.

list(list &&x, alloc=null) ;

-initializer list const.

list(initializer_list<value_type> il, alloc=allocator_type()) ;


std::list<int> first ;

std::list<int> second (4, 100) ;    // 4개, 100의 값으로 채움.

std::list<int> third( second.begin(), second.end() ) ;

std::list<int> fourth (third ) ;

int arr1[]={1,2,3,4} ;

std::list<int> fifth( arr1, arr1+sizeof(arr1)/sizeof(int) ) ;


+일반적인 메소드

size() ; 요소 개수

back(), front() ; 마지막, 처음 원소 값.

begin(), end() ; iterator, 앞에 c를 붙이면 const type.

rbegin(), rend() ; reverse iterator, 앞에 c를 붙이면 const.

insert()

erase()


+수정

push_back(), pop_back()

push_front(), pop_front() ; 앞에서 추가할 수도 있다. (벡터는 앞에 추가하려면 .insert( .begin() , ..)을 사용해야 한다. )

emplace(), emplace_back(), emplace_front()

std::list< std::pair<int, char> > mylist ;

mylist.emplace_back( 10, 'a') ;

mylist.emplace_front( 20, 'b') ;

mylist.emplace( mylist.begin(), 100, 'x') ;

for (auto &x : mylist)  std::cout << x.first << ":" << x.second <<  "\n" ;

+reverse()

순서를 뒤집는다.


+sort()

정렬 ; 파라미터를 주지 않으면 디폴트로 오름차순 정렬된다.


bool compare_nocase(const std::string &first, const std::string &second) {

unsigned int i=0; 

while ( (i<first.length()) && (i<second.length()) ) {

  if ( tolower(first[i]) < tolower(second[i])) return true ;

  else if ( tolower(first[i]) > tolower(second[i]) ) return false ;

  ++i ;

}

return ( first.length() < second.length() ) ;

}

mylist.sort( compare_nocase ) ;



+unique()

중복 값을 가진 노드들을 제거한다.

mylist.sort() ;

mylist.unique() ;

mylist 출력 : 중복된 값들이 제거되고 오름차순으로 출력됨. 


중복의 범위를 정하는 함수 사용.

struct is_near { 

  bool operator() (double first, double second) {  return  (fabs(first-second) < 5.0 ) ; } 

} ;

mylist.unique( is_near() ) ; // 5.0 미만의 차이는 중복으로 보고 중복 제거한다. 


+=operator

내용을 모두 복사함.


+assign()

할당. 새로운 리스트의 내용으로 덮어쓴다. 

assign( inputiterator first, last)

assign(size_type n , const value_type &val) ;

assign( initializer_list<value_type> il) ;

std::list<int> first ;

first.assign(7, 100) ;    // 7개를 100으로 채움.

second.assign( first.begin(), first.end() ) ;


+ remove() ;특정 값을 찾아 요소를 삭제한다.

remove( const value_type & val) ;

erase()는 위치를 파라미터로 주고 삭제하는 것이고, remove()는 값을 찾아 삭제해 준다.


+remove_if() ; 조건에 따른 삭제.

struct is_odd {

bool operator() ( const int&value ) {  return (value%2)==1; } 

} ;

mylist.remove_if(is_odd()) ;        // 홀수를 제거한다.



+splice() ; 리스트를 다른 리스트로 이동. (copy가 아님)

-전체 ; splice( const_iterator position, list &x) ;

    splice(const_iterator position, list && x) ;

-한 개 ; splice( position, list &x, const_iterator i) ;

-범위 ; splice( position, x, first, last) ;

x에서 지정된 위치의 범위를 지정된 위치로 전송/삽입한다.

mylist = 1,2,3,4

mylist2 = 10,20,30

it = mylist.begin()+1 ;

mylist1.splice(it, mylist2) ;    // 1 10 20 30 2 3 4 , mylist2는  empty가 된다. (전송되었으므로.) 위에서 지정한 it는 여전히 2를 가리키므로 위치가 begin()+4 위치로 된다. 

mylist2.splice(mylist2.begin(), mylist1, it) ; // mylist2=2  ,   mylist=1 10 20 30 3 4 (2가 이동됨.)

it = mylist.begin()+3 ;

mylist.splice( mylist.begin(), mylist, it, mylist1.end() ) ; // 30 3 4 1 10 20


+merge() ; 병합. x의 데이터가 transfer 이동 됨.  splice()와 비슷하나 순서에 맞게 들어간다.

merge(list& x) ;

merge(list &x, Compare comp) ;

first.sort() ;

second.sort() ;

first.merge(second) ;    // second는 empty가 된다. second의 요소들이 first에 순서에 맞게 전부 추가됨.

first.merge(second, mycomparison) ;

bool mycomparison(double first, double second) {  return ( int(first) < int(second)) ; }














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

string  (0) 2018.05.30
map  (0) 2018.05.29
Array 1  (0) 2018.05.25
Vector 3  (0) 2018.05.23
Vector 2  (0) 2018.05.18
반응형

cpp array class

fixed size의 순서있는 컨테이너. 선형적 연속으로 순서있게 요소들이 배열된다.

다른 표준 컨테이너들과는 달리 고정된 크기이고 요소들의 메모리 할당을 관리하지 않는다.

동적인 확장이 불가능하다. zero-size 도 가능하지만 dereference할 수는 없다.

#include <array>


+이터레이터 함수.

begin(), end(), rbegin(), rend(), cbegin(), cend(), crbegin(), crend()

사용 방법은 벡터와 같다.

+용량 함수

size() ; 요소 개수

max_size(); 최대 개수. array에서는 size()와 같다. 

empty() ; 비었는지 확인. true/false

+요소 접근

[] operator

at()

front(); 처음 요소값을 참조로 리턴

back() ; 마지막 요소값을 참조로 리턴

data() ; 데이터 포인터를 얻어온다.

+수정

fill() ; 특정 값으로 채운다.

swap() ; 같은 타입인 두 개의 배열을 서로 바꾼다. (같은 크기여야 한다. 다른 크기면 컴파일 에러)


+at과 []의 차이점.

둘 다 주어진 인덱스의 요소를 참조로 리턴한다. at은 파라미터로 주어진 인덱스가 범위를 벗어나면 out_of_range exception이 발생한다. [] operator에서는 범위를 벗어나면 프로그램이 죽는다.(범위체크가 없음. 수동으로 해줘야 함.)


std::array<int, 10> arr1 ;

for (int i=0; i<10; i++) arr1.at(i)=i+1 ;    // 1부터 10까지 할당

std::cout << arr1.front() << std::endl ;    // 첫 번째 요소 값 출력. 1

std::cout << arr1.back() << std::endl ;    // 마지막 요소 값 출력. 10

arr1.front() =100 ;    // 첫 번째 요소에 100을 할당. 1 대신 100으로 덮어씀.

arr1.back() = 50 ;    // 마지막 요소에 50을 할당. 10대신 50으로 덮어씀.


const char* cstr="Test string";    // 11자 alpha+1 null char.

std::array<char,12> arr2 ;

std::memcpy(arr2.data(), cstr, 12) ;

std::cout << arr2.data() << std::endl ;    // 위 스트링이 출력됨.


std::array<int, 6> arr1 ;    // int 타입 6개 크기 배열을 생성.

arr1.fill(5) ;    // 5로 전부 채움.


std::array<int, 5> f = {1,2,3,4,5} ;

std:;array<int, 5> g={10,20,30,40,50} ;

f.swap(g) ;    // f, g를 바꿈.

for (int &x : f) std::cout << x << '  ' ;        // 모든 원소 출력. 10 20 30 40 50

std::cout<<'\n' ;


참고) std::fill_n( 위치, 개수, 값) ; 특정 위치에서 n개를 특정 값으로 채움.

fill_n( OutputIterator first, Size n , const T & val) ;

std::vector<int> v1(8, 10) ;    // 8개 10으로 다 채움.

std::fill_n(v1.begin(), 4, 20) ;    // 처음부터 4개를 20으로 채움. 20,20,20,20,10,10,10,10

std::fill_n(v1.begin()+3, 3, 33 ) ;    // 인덱스3번 위치부터 3개를 33으로 채움. 20, 20, 20, 33, 33, 33, 10, 10





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

map  (0) 2018.05.29
List 1  (0) 2018.05.28
Vector 3  (0) 2018.05.23
Vector 2  (0) 2018.05.18
Vector 1  (0) 2018.05.16
반응형

Vector 3 추가/삭제/변경


-swap

같은 타입의 두 벡터의 엘리먼트들을 바꾼다. 크기는 상관없다.

std::vector<int> foo(3,100) ;     // 100을 값으로 갖는 요소 3개

std::vector<int> bar(5, 200) ;    // 300을 값으로 갖는 요소 5개


foo.swap(bar);    // foo와 bar 두 개의 벡터들이 서로 바뀐다.

foo ; ==> 200 200 200 200 200

bar ; ==> 100 100 100


-push_back ; 벡터 마지막에 요소 추가. 복사(새롭게) 추가됨. 벡터 크기가 자동으로 증가. 메모리도 부족하면 자동으로 추가 할당됨.

std::vector<int> v1 ;

v1.push_back(100) ;

v1.push_back(200) ;

-pop_back ; 벡터 마지막 요소를 제거한다. 리턴값 없음.

마지막 요소값을 확인하려면 pop_back()하기 전에 back()으로 확인 가능.

while( !v1.empty() ) {

   sum+=v1.back() ;

  v1.pop_back() ;

}

v1벡터가 빌때까지 하나씩 요소들을 제거함. 요소 제거 전에 제거할 값을 얻어 총 합을 구한다.


-insert

특정 위치가 새로운 요소를 삽입한다.

insert ( const_iterator position,  const value_type & val) ;

insert( " , size_type n, const value_type &val) ;

insert(", InputIterator first, InputIterator last) ;

insert(", value_type&& val) ;

insert(", initializer_list<value_type> il) ;

리턴값 ;새로 추가한 첫번째 요소 위치 이터레이터

std::vector<int> v1(3,100) ;    // 100 100 100

std::vector<int>::iterator it ;

it = v1.begin() ;

it = v1.insert(it, 200) ;    // 200 100 100 100

v1.insert(it, 2, 300) ; // 300 300 200 100 100 100 

std::vector<int> v2(2, 400) ;    // 400 400 

v1.insert(v1.begin()+2, v2.begin(), v2.end()) ;    // 300 300 400 400 200 100 100 100 

(v2.end() 전 위치까지만 추가함).

int arr[]={501,502,503};

v1.insert(v1.begin(), arr, arr+3 ) ;    // 501 502 503 300 300 400 400 200 100 100 100 

 (arr+3 전 위치까지 추가함.)


 -erase

특정 위치 또는 위치 범위의 요소들을 제거

v1.erase(v1.begin()+5) ;    // 6번째 요소를 제거함. (인덱스는 0부터시작)

v1.erase(v1.begin(), v1.begin()+3) ;    // 앞에서 부터 3개를 제거. (두 번째 파라미터로 지정한 위치 전까지만 제거됨)

-clear ; 전체 요소 삭제


-emplace

할당과 삽입. insert는 복사하여 삽입이지만, emplace는 할당된 것을 그대로 사용하여 성능면에서는 낫다.

std::vector<int> v1={10,20,30} ;

auto it = v1.emplace(v1.begin()+1, 100) ;    // 10, 100, 20, 30

v1.emplace(it, 200) ;    // 10, 200, 100, 20, 30

v1.emplace(v1.end(), 300) ;    // 10, 200, 100, 20, 30, 300


-emplace_back

push_back()과 거의 똑같다. push_back()은 복사하여 사용하는데, emplace_back은 construct 한 것을 그대로 사용하기 때문에 성능면에서 좀 낫다.

v1.emplace_back(100);    // v1 마지막에 100 추가.





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

List 1  (0) 2018.05.28
Array 1  (0) 2018.05.25
Vector 2  (0) 2018.05.18
Vector 1  (0) 2018.05.16
정규식으로 스트링 일부 추출하기  (0) 2018.03.10
반응형

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  (0) 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  (0) 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
반응형


파이썬은 자료 구조를 쉽게 파일로 저장 및 로딩할 수 있다.


+ Pickle : Save & Load        데이터 저장/로딩

주의! 저장한 순서대로 로딩해야 한다.


- pickle 모듈 사용

저장 파일이 있으면 로딩하고, 없으면 저장하는 샘플.

import os, pickle

savefile='mnist.pkl'
if os.path.exists(savefile) :
    print('loading from cache...')
    f = open(savefile, 'rb')
    x_train = pickle.load(f)
    x_test =  pickle.load(f)
    f.close()
else:
    print('downloading.. MNIST..')
    (x_train,_), (x_test, _) = mnist.load_data()
    f = open(savefile, 'wb')
    pickle.dump(x_train, f)
    pickle.dump(x_test, f)
    f.close()


'Python' 카테고리의 다른 글

WebAPI thread work status  (0) 2018.07.03
Python BeautifulSoup 웹크롤링/HTML 파싱.  (0) 2018.04.25
Python 커맨드라인 파싱  (0) 2018.04.17
Python 쉘 커맨드 실행  (0) 2018.04.12
Python JSON 사용하기  (0) 2018.04.10

+ Recent posts