U E D R , A S I H C RSS

AcceleratedC++/Chapter5

1. Chapter 5 Using sequential containers and analyzing strings

  • —ฌƒœนŒง€ vector๋ž‘ string ฐ–  ž˜ ๋†€•˜‹ค.  œ ฒƒ๋“ค„„˜–ด„œ๋Š” ฒƒ„ ‚ดŽด๋ณผ ฒƒด๋‹ค. ธ๋Ÿฌ๋ฉด„œด๋ธŒ๋Ÿฌ๋ฆฌ ‚ฌšฉ๋ฒ•— ๋Œ€•ด ๋” นŠฒŒ ••˜ฒŒ ๋ ฒƒด๋‹ค. ๋ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ž๋ฃŒตฌกฐ?•ˆ˜๋งŒ„  œณต•ฃผ๋Š” ฒƒ•„‹ˆ๋‹ค. ŠผŠผ•œ •„‚ค…ณ๋„ ๋ฐ˜˜•ค€๋‹ค. ๋งˆ˜ vector˜ ‚ฌšฉ๋ฒ•„ •ŒฒŒ ๋˜๋ฉด, ๋‹ค๋ฅธฒƒ๋„ ‰ฝฒŒ ๋ฐฐšธˆ˜ žˆ๋Š”ฒƒ˜๋Ÿผ...

1.1. 5.1 Separating students into categories

  • f๋œ•™ƒณผ •„‹Œ •™ƒœผ๋กœ ๋‚˜๋ˆ  ๋ณดž.
    ~cpp 
    bool fgrade(const Student_info& s)
    {
    	return grade(s) < 60;
    }
    
    vector<Student_info> extract_fails(vector<Student_info>& students)
    {
    	vector<Student_info> pass, fail;
    	for(vector<Student_info>::size_type i = 0; i != students.size() ; ++i)
    	{
    		if(fgrade(students[i]))
    			fail.push_back(students[i]);
    		else
    			pass.push_back(students[i]);
    	}
    	students = pass;
    	return fail;
    }
     
  • ฐธกฐ๋กœ„˜–ด„ students˜  ˆ˜๋ฅผ ๋ชจ๋‘ –ด๋“ค—ฌ„œ, 60 •˜๋ฉด fail ๋ฒก„—, •„‹ˆ๋ฉด pass ๋ฒก„— ๋„€ ๋‹Œ, students ๋ฒก„ฐ๋ฅผ pass๋ฒก„ฐ๋กœ ๋ฐ”ฟ”ค€๋‹ค. ธ๋ฆฌ  fail„ ๋ฆฌ„•ค€๋‹ค. ฆ‰ students—๋Š” f •„‹Œ •™ƒ๋งŒ, ๋ฆฌ„ด๋œ vector—๋Š” f ๋œ•™ƒ๋งŒ ๋‚จ•„žˆฒŒ ๋˜๋Š” ฒƒด๋‹ค. ๋ญ”ฐ€ ข€ ‚๋ฆฌ๋ฆฌ•˜‹ค. ๋” ‰ฌšด ๋ฐฉ๋ฒ•žˆ„ ๋“ฏ•˜‹ค.

  • 1.1.1. 5.1.1 Erasing elements in place

  • ธ๋ ‡๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ฐ€ žˆ๋Š” ฒƒด๋‹ค. for๋ฃจ”„ฐ€ ๋๋‚ •Œ—๋Š” ‘๋ณต๋˜๋Š” ๋‘œ˜ ๋ฒก„ฐ€ กดžฌ•˜๋Š” ฒƒด๋‹ค. ธ๋ž˜„œ šฐ๋ฆฌฐ€ “ธ ๋ฐฉ๋ฒ•€ ๋งŒ•ฝ f๋ฉด fail— ถ”ฐ€•˜ , f •„‹ˆ๋ฉด ž๋ฆฌ—„œ ง€šฐ๋Š” ฒƒด๋‹ค. ๋ฐ˜‘ฒŒ๋„ ด๋Ÿฐ ธฐ๋Šฅžˆ๋‹ค. ผ๋ฐ กธ๋ผ ๋А๋ฆฌ๋‹ค. ž…๋ ฅ ๋ฐ„˜ –‘ปคงˆˆ˜๋ก „ฑ๋Šฅ  €•˜๋Š” ธ‰ฒฉ•˜‹ค. ๋ฒก„—„œ๋Š” ‘„— •˜๋‚˜๋ฅผ ง€šฐ๋ฉด, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ †ตงธ๋กœ‹‹œ • ‹•˜ , ง€›Œฃผ๋Š” ง“„ •••œ‹ค. O(n*n)˜ ‹œ„•„š”•œฒƒœผ๋กœ •Œ  žˆ๋‹ค. ๋ฒก„ฐ๋Š” ž„˜  ‘ฐ€๋Šฅ•œ ๋Œ€‹ , ‘„ ‚ฝž…ด๋‚˜ ‘„ ‚ญ œ˜ ผฌ๋จผŠค๋ฅผ ฌธฐ•œ ฒƒด๋‹ค.  œ๋ถ€„—ฌ๋Ÿฌฐ€ง€ ๋ฐฉ๋ฒ•„ ‚ดŽด๋ณผ ฒƒด๋‹ค.
  • ๋จผ € ๋А๋ฆฌง€๋งŒ, งด€ ธ ๋ฐฉ๋ฒ•๋ถ€„‚ดŽด๋ณดž.
    ~cpp 
    vector<Student_info> extract_fails(vector<Student_info>& students)
    {
    	vector<Student_info> fail;
    	vector<Student_info>::size_type i = 0
    	while(i != students.size()) {
    		if(fgrade(students[i])) {
    			fail.push_back(students[i]);
    			students.erase(students.begin() + i);
    		} else
    			++i;
    	}
    	return fail;
    }
     
    • ™œ students.erase(studentsi) •˜ง€ •Š๋Š”ฐ€? ๋ชจ๋“  ปจ…Œด๋„ˆ— ด€„„  œณต•˜ธฐ œ„•„œ  •œ‹ค. ๋ฐ”๋กœ ๋ฐ˜๋ณตž๋ผ ๋ถˆ๋ฆฌšฐ๋Š” ฒƒ„ šฉ•ด, (ฌ„ฐ๋ณด๋‹ค ๋ฐ˜๋ณตžฐ€ ๋จผ € ๋‚˜˜ค๋„š”.) ๋™•œ ๋ฐฉ๋ฒ•œผ๋กœ  œ–ด๋ฅผ • ˆ˜ žˆ๋Š” ฒƒด๋‹ค.
    • ธ๋ฆผ ๋ณด๋ฉด •Œ ง€๋งŒ, ๋ณต‚ฌ ฒ๋‚˜ฒŒ •ด๋Œ„‹ค. •˜๋‚˜ ง€šธ๋•Œ๋งˆ๋‹ธ ๋’ค— žˆ๋Š”ฑธ ๋‹ค ๋ณต‚ฌ•˜๋Š” ฒƒด๋‹ค. ๋งŒ•— ๋ชจ๋‘ failด๋ผ๋ฉด? ๋”ฐ•˜‹ค.
    • ˜•œ, ง€›ŒคŒœผ๋กœจ ปจ…Œด๋„ˆ˜ ‚ฌฆˆฐ€ ๋ณ€•œ‹ค. ฆ‰ ๋ชจ๋“  •™ƒ„‹ฒ€‚ฌ•˜ง€ ๋ชป• ˆ˜๋„ žˆ๋‹ค. ธ๋ž˜„œ‹Œณผ ฐ™ด ๋ฐ”ฟ”ฃผ–ด••œ‹ค.

  • ~cpp 
    vector<Student_info> extract_fails(vector<Student_info>& students)
    {
    	vector<Student_info> fail;
    	vector<Student_info>::size_type i = 0;
             vector<Student_info>::size_type size = students.size();
    	while(i != size) {
    		if(fgrade(students[i])) {
    			fail.push_back(students[i]);
    			students.erase(students.begin() + i);
    		} else
    			++i;
    	}
    	return fail;
    }
     

    1.1.2. 5.1.2 Sequential versus random access

    • œ„˜ ๋ฒก„ฐ๋Š” ž„˜  ‘•„š”•˜ง€ •Š๋‹ค. ธ๋ƒฅ ˆœฐจ œผ๋กœ  ‘•  ๋ฟด๋‹ค. ž„˜ ‘„ ฌธฐ•œผ๋กœจ ƒธฐ๋Š” —ฌ๋Ÿฌฐ€ง€ ด๋“žˆ๋Š” ปจ…Œด๋„ˆฐ€ žˆ„ ฒƒด๋‹ค. ธ๋ณด๋‹ค ๋จผ € ปจ…Œด๋„ˆ๋ฅผ šจณผ œผ๋กœ  œ–ด• ˆ˜ žˆฒŒ •ฃผ๋Š” ๋ฐ˜๋ณตž๋ผ๋Š” ฒƒ„ ๋จผ € ‚ดŽด๋ณดž.

    1.2. 5.2 Iterators

  • —ฌƒœป ž˜“ฐ๋˜ ๋ฒก„˜• ๋ณ€ˆ˜n€ ๋ฒก„˜ n๋ฒˆงธ š”†Œ๋ฅผ ๋ง•œ‹ค. ง€ธˆนŒง€ •˜๋˜ฑฐ ๋ณด๋ฉด ๋ฃจ”„ •ˆ—„œ ++i ฑฐ๋ฐ–— —†๋‹ค. ฆ‰ ˆœฐจ œผ๋กœ๋งŒ ๋†€•˜‹ค๋Š” ๋œด๋‹ค. šฐ๋ฆฌ๋Š” •Œง€๋งŒ ปดŒŒผ๋Ÿฌ๋Š” •Œธธ—†๋‹ค. —ฌธฐ„œ ๋ฐ˜๋ณตž(Iterators)๋ผ๋Š” ฒƒ„ •Œ•„๋ณดž.
    • ปจ…Œด๋„ˆ™€ ปจ…Œด๋„ˆ •ˆ˜ š”†Œ๋ฅผ ™•
    • š”†Œ •ˆ—  €žฅ๋˜–ด žˆ๋Š” ฐ’ ™•
    • ปจ…Œด๋„ˆ •ˆ˜ š”†Œ๋“ค ‚ฌด๋ฅผ ™”๋‹ฐ”๋‹• ˆ˜ žˆ๋Š” ธฐ๋Šฅ
    • ปจ…Œด๋„ˆฐ€ šจณผ œผ๋กœ‹ค๋ฃฐˆ˜ žˆ๋Š” —ฐ‚ฐ๋งŒ„ ฐ€ง€  ๋†€๋„๋ก  œ•œ•˜๋Š” ธฐ๋Šฅ
  • ˆ˜ๆ›ฐ : STL„ ‚ฌšฉ• •Œ—๋Š” ๋ฐ˜๋ณตž๋ฅผ šฉ•˜๋Š” ฒƒ‘œค€ด๋•œ‹ค.
  • ธ๋ฑŠค๋กœ   ฝ”๋“œ๋ฅผ ๋ฐ˜๋ณตž๋กœ   ฝ”๋“œ๋กœ ๋ฐ”พผ ˜ˆ
    ~cpp 
    for(vector<Student_info>::size_type i = 0 ; i != students.size() ; ++i)
    	cout << students[i].name << endl;		
     

    ~cpp 
    for(vector<Student_info>::const_iterator i = students.begin() ; i != students.end() ; ++i)
    	cout << (*i).name << endl;
     

  • ƒ†Œ•œฒŒ ๋ณดง€ •Š๋Š”ฐ€? •˜๋‚˜•˜๋‚˜”ฉ ‚ดŽด๋ณดž.

  • 1.2.1. 5.2.1 Iterator types

  • ‘œค€ ปจ…Œด๋„ˆ—  •˜ ๋˜–ด žˆ๋Š” ๋ฐ˜๋ณตž˜ ข…๋ฅ˜๋Š” ๋‹Œ ๋‘ฐ€ง€๋‹ค.
    • const_iterator : ฐ’„ ๋ณ€ฒฝ‹œ‚คง€ •Š  ˆœšŒ• •Œ
    • iterator : ธ๋ƒฅ ˆœšŒ• •Œ
  • „ธ๋ถ€ ฑด ๋ชฐ๋ผ๋„ ๋œ‹ค.
  • •„𔗐 ๋”ฐ๋ผ iterator—„œ const_iterator๋กœ บŠคŒ…๋œ‹ค. ๋ฐ˜๋Œ€๋Š” •ˆ๋œ‹ค.

  • 1.2.2. 5.2.2 Iterator Operations

  • begin()ณผ end()๋Š” ฐฐ ปจ…Œด๋„ˆ˜ ๋งจ ˜Œ š”†Œ๋ฅผ ฐ€๋ฆฌ‚ค๋Š” ๋ฐ˜๋ณตž™€, ๋งจ ๋งˆง€๋ง‰—„œ •œนธ ง€๋‚œ ฒƒ„ ฐ€๋ฆฌ‚ค๋Š” ๋ฐ˜๋ณตž๋ฅผ ๋ฆฌ„•ค€๋‹ค.
  • ++i : ธ๋ƒฅ “ฐ๋ฉด ๋œ‹ค. ฐ ปจ…Œด๋„ˆ๋งˆ๋‹ตฌ˜„€ ๋‹ค๋ฅผ…Œง€๋งŒ, ๋†€๋šธ  •๋„˜ ถ”ƒ™”๋กœ ‚ฌšฉž๋“ค๋กœ •˜—ฌธˆ ๋ชจ๋ฅด  จ๋„ ๋˜ฒŒ ๋งŒ๋“ค—ˆ๋‹ค. ๋ฐ˜๋ณตž๋ฅผ •˜๋‚˜”ฉ ฐ€‹œ‚ค๋Š” ฒƒด๋‹ค.
  • '*' : —ญฐธกฐ —ฐ‚ฐž๋ผ ๋ถˆ๋ฆฌšด๋‹ค.
  • (*i).name : ๋ฐ˜๋ณตž iฐ€ ฐ€๋ฆฌ‚ค๋Š” š”†Œ˜ ๋ฉค๋ฒ„ name„ ๋ง•œ‹ค. „˜ธ๋ฅผ ผญ จฃผž. šฐ„ ˆœœ„ฐ€ .ด *๋ณด๋‹ค ๋†’ธฐ ๋•Œ๋ฌธ— —๋Ÿฌ๋‚œ‹ค.

  • 1.2.3. 5.2.3 Some syntactic sugar

  • (*i).name ด๋ ‡ฒŒ •˜ธฐ €ฐฎ๋‹ค. i->name ด๋ ‡ฒŒ •˜๋ฉด ๋œ‹ค.

  • 1.2.4. 5.2.4 The meaning of students.erase(students.begin() + i)

  • begin()ด ๋งจ ˜Œ š”†Œ๋ฅผ ฐ€๋ฆฌ‚ค๋Š” ๋ฐ˜๋ณตž๋ฅผ ๋ฆฌ„•ค€๋‹  –ˆ๋‹ค. ธ๋Ÿผ i๋ฅผ ๋”•˜๋ฉด? i๋ฒˆ쨰 š”†Œ๋ฅผ ฐ€๋ฆฌ‚ค๋Š” ๋ฐ˜๋ณตžฐ€ ๋ฆฌ„ด๋ ฒƒด๋‹ค.
  • •˜ง€๋งŒ ž„˜  ‘„ ง€›•˜ง€ •Š๋Š” ปจ…Œด๋„ˆ—๋‹ €ง“•˜๋ฉด •ˆ๋œ‹ค. + —ฐ‚ฐžฐ€  •˜๋˜–ด žˆง€ •Šธฐ ๋•Œ๋ฌธ— ปดŒŒ—๋Ÿฌ ๋œฌ๋‹ค.

  • 1.3. 5.3 Using iterators instead of indices

  • ธ๋ฑŠค “ฐ๋˜ •ˆ˜๋ฅผ ๋ฐ˜๋ณตž๋กœ๋งŒ ๋ฐ”ฟ” ๋ณดž.
    ~cpp  
    vector<Students_Info> extract_fails(vector<Student_info>& students)
    {
    	vector<Student_info> fail;
    	vector<Student_info>::iterator iter = students.begin();
    	while(iter != students.end()) {
    		if(fgrade(*iter)) {
    			fail.push_back(*iter);
    			iter = students.erase(iter);
    		} else
    			++iter;
    	}
    	return fail;
    }
     
  • •„นŒ๋Š” const˜€๋Š”๋ฐ ด๋ฒˆ—” ™œ •„‹ˆ๋ƒ ? ปจ…Œด๋„ˆ •ˆ— žˆ๋Š” ฒƒ„ ง€šฐง€ •Š๋Š”ฐ€. ฆ‰ ๋ณ€˜•‹œ‚จ๋‹ค๋Š” ฒƒด๋‹ค.
  • ˜ ‹ ธฐ•œฒŒ ๋ณดธ๋‹ค. ™œ students.erase(iter) •ค€ฒƒ„˜ iter—๋‹ค ๋Œ€ž…•ฃผ—ˆ๋Š”ฐ€? ‚ญ œ•˜๋ฉด ๋ฐ˜๋ณตžฐ€ ๋ชจ๋‘ ฐฑ‹ ๋˜ธฐ ๋•Œ๋ฌธด๋‹ค. ง€šด ๋’๋ถ€๋ถ„€ ๋ชฝ๋•… žฌ• ‹•••˜‹ˆ... ง€ธˆ€ ๋ฌดŠจ ๋งง€ ๋ชฐ๋ผ๋„ ‹‹ค. ธ๋ ‡๋‹ค๋Š” ฒƒ๋งŒ •Œ•„‘ž. erase๋Š” ๋ฐฉธˆ ง€šด ๋ฐ”๋กœ ธ ๋ถ€๋ถ€„ ๋ฆฌ„•ค€๋‹ค.
  • ˜ ฝ”๋“œ œ ™” •œ‹ ‹Œ  ฐ™€ ‚ฝงˆ„ •˜๋Š” ‚ฌ๋žŒ๋„ žˆ„ ฒƒด๋‹ค.
    ~cpp 
    while(iter != students.end())
    /*...*/
     
  • „
    ~cpp 
    vector<Student_info>::iterator iter = students.begin(). end_iter = students.end();
    while(iter != end_iter)
    /*...*/
     
  • ด๋ ‡ฒŒ ๋งด๋‹ค. •˜ง€๋งŒ •ˆ๋œ‹ค. •„นŒ ๋ง–ˆ๋“ฏด, •˜๋‚˜ ง€šฐ๋ฉด ธ ๋’ค˜ ๋ฐ˜๋ณตž๋Š” ๋ชจ๋‘ ฐฑ‹ ๋˜ธฐ ๋•Œ๋ฌธ—, ๋ฏธ๋ฆฌ  €žฅ•ด๋†“€ end_iter๋Š” “ธ๋ชจฐ€ —†–ด„‹ค. “ฐ๋ ˆธฐ ฐ’ด ๋‚จ๋Š” ฒƒด๋‹ค.

  • 1.4. 5.4 Ranking our data structure for better performance

  • ๋ฒก„ฐ๋Š” ž„˜  ‘„ ง€›•˜๋Š” ๋Œ€‹ —, ‘„ ‚ฝž…, ‚ญ œ˜ „ฑ๋Šฅผฌ๋ž๋‹ค. ธ๋Ÿฌ๋ฏ€๋กœ ‘„ ‚ฝž…, ‚ญ œฐ€ œ ™”๋œ ƒˆ๋กœšด ž๋ฃŒตฌกฐ๋ฅผ ƒฐ•ด ๋ณดž.

  • 1.5. 5.5 The list type

  • ๋ฐ”๋กœ list๋‹ค. ‘„ ‚ฝž…ณผ ‚ญ œ๋ฅผ ƒˆ˜‹œ„ ๋‚ด— ˆ˜–‰• ˆ˜ žˆ๋‹ค.  œ vector๋กœ   ฝ”๋“œ๋ฅผ list๋กœ   ฝ”๋“œ๋กœ ๋ฐ”ฟ”๋ณดž. ๋ฐ”๋€ฒŒ ๋ณ„๋กœ —†๋‹ค. vectorฐ€ list๋กœ ๋ฐ”๋€ฑฐ ๋ง ๋Š”... ๋‹‹œ •œ๋ฒˆ ๋ง•˜ง€๋งŒ list๋Š” ž„˜  ‘„ ง€›•˜ง€ •Š๋Š”๋‹ค. ๋”ฐ๋„œ vector—„œ “ฐ๋˜ฒƒ˜๋Ÿผ [] “ฐ๋ฉด •ˆ๋œ‹ค.

  • 1.5.1. 5.5.1 Some important differences

  • ๋ฒก„ฐ๋Š” ‚ฝž…, ‚ญ œ • •Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ชฝ๋•… žฌ• ‹•œ‹ค. ๋”ฐ๋„œ ~~.end()๋Š” ๋ฒ„˜ ˜ƒ™ผ๋‹ค. „† ๋ฐ”๋€Œ๋ฏ€๋กœ... •˜ง€๋งŒ list๋Š” ‚ฝž…, ‚ญ œ•œ‹  ๋ชฝ๋•… žฌ• ‹•˜ง€ •Š๋Š”๋‹ค. ธ๋ž˜„œ ๋น ๋ฅธ ฒƒด๋‹ค. ๋˜•œ ž„˜  ‘„ ง€›•˜๋Š” ปจ…Œด๋„ˆ๋งŒ “ธˆ˜ žˆ๋Š” ‘œค€ •Œ ๋ฆฌ˜ sort๋„‹—ฐžˆ “ธˆ˜ —†๋‹ค. ธ๋ž˜„œ list˜ ๋ฉค๋ฒ„•ˆ˜๋กœ sortฐ€ žˆ๋‹ค. ๋‹Œณผ ฐ™จฃผž.
    ~cpp 
    students.sort(compare);
     

  • 1.5.2. 5.5.2 Why bother?

  • ‘œ๋ฅผ ๋ณด๋ฉด •Œ ง€๋งŒ, ŒŒฌธฐฐ€ ปคงˆˆ˜๋ก vector˜ š”†Œ ‚ฝž…, ‚ญ œ ‹œ„€ ๋น„• œผ๋กœ ฐ€•œ‹ค. list๋Š” ๋ณ„๋กœ •ˆ ฐ€•œ‹ค.

  • 1.6. 5.6 Taking strings apart

  • string๋„ vector˜๋Ÿผ “ธˆ˜ žˆ๋‹ค. ‹ œ๋กœ๋Š” vector<char>ด๋‹ˆ... vector˜ ๋Œ€๋ถ€๋ถ„˜ ธฐ๋Šฅ„ ง€›•œ‹ค. []ณผ ๋ฐ˜๋ณตž๋Š” ๋ฌผ๋ก  size() ๋“ฑ๋“ฑ๋„..
  • ธ๋Ÿฌ๋ฉด„œ ฃผ–ด„ string„ ณต๋ฐฑ„ ธฐค€œผ๋กœ ž๋ฅธ ๋‹Œ vector— ๋„–ด„œ ๋ฆฌ„•˜๋Š” ˜ˆ œ๋ฅผ ๋ณด—ฌฃผ  žˆ๋‹ค. ๋ณ„๋กœ ๋ณผฑด —†๋‹ค.
  • 1.7. 5.7, 5.8

  • ธ๋ƒฅ stringฐ€ง€  ™”๋ฉด— ๋ฟŒ๋ฆฌ๋Š” ƒ•œ žฅ๋‚œ˜  žˆ๋‹ค. ๋ณ„๋กœ ๋ณผฑฐ —†๋‹ค.
  • ง€ธˆ ๋ณด๋‹ˆนŒ “ธ๋งŒ•œ Œ•˜๋‚˜ žˆ๋‹ค. ๋ฐ”๋กœ •œ ปจ…Œด๋„ˆ— ๋‹ค๋ฅธ ปจ…Œด๋„ˆ˜ ๋‚ดšฉ๋“ค„„ฃ๋Š” ˜ˆ œด๋‹ค.
    ~cpp 
    for(vector<string>::const_iterator i = bottom.begin(); i != bottom.end(); ++i)
        ret.push_back(*it);
     
  • ด๋ ‡ฒŒ “ธฒƒ„,
    ~cpp 
    ret.insert(ret.end(), bottom.begin(), bottom.end());
     
  • ด๋ ‡ฒŒ „‹žˆ “ธˆ˜ žˆ๋‹ค.


  • Valid XHTML 1.0! Valid CSS! powered by MoniWiki
    last modified 2021-02-07 05:22:25
    Processing time 0.0452 sec