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.0295 sec