ํฌ์ŠคํŠธ

CS โ€” 1 vector vs hash concepts

CS โ€” 1 vector vs hash concepts

๐Ÿ“• 15-1 โ€” push_back ยท emplace_back ยท ํ•ด์‹œ ๊ฐœ๋… ์งˆ๋ฌธ ์ •๋ฆฌ

15_pushback_vs_emplaceback.md ๋ฅผ ์ฝ์œผ๋ฉฐ ๋‚˜์˜จ ์งˆ๋ฌธ๋“ค์„ ๋ชจ์•„ ์ •๋ฆฌํ•œ ๋ณด์ถฉ ํŒŒ์ผ.


Q1. explicit ์ƒ์„ฑ์ž๋ž€? placement new? ๊ฐ€๋ณ€ ํ…œํ”Œ๋ฆฟ ์ธ์ž ์ „๋‹ฌ?

explicit ์ƒ์„ฑ์ž

์•”์‹œ์  ๋ณ€ํ™˜์„ ๋ง‰๋Š” ํ‚ค์›Œ๋“œ. ์ƒ์„ฑ์ž ์•ž์— ๋ถ™์ด๋ฉด ๋ช…์‹œ์  ํ˜ธ์ถœ๋งŒ ํ—ˆ์šฉ.

1
2
3
4
5
6
7
struct Wrapper {
    explicit Wrapper(int x) : x(x) {}
    int x;
};

Wrapper w = 42;    // โŒ ์•”์‹œ์  ๋ณ€ํ™˜ ๊ธˆ์ง€ โ€” ์ปดํŒŒ์ผ ์—๋Ÿฌ
Wrapper w(42);     // โœ… ๋ช…์‹œ์  ํ˜ธ์ถœ๋งŒ ํ—ˆ์šฉ

placement new

์ด๋ฏธ ํ™•๋ณด๋œ ๋ฉ”๋ชจ๋ฆฌ ์œ„์— ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฌธ๋ฒ•. ์ƒˆ ํž™ ํ• ๋‹น ์—†์ด ์ฃผ์†Œ๋งŒ ์ง€์ •.

1
2
char buf[sizeof(Point)];
Point* p = new(buf) Point(1, 2);  // buf ๋ฉ”๋ชจ๋ฆฌ ์œ„์—์„œ Point(1,2) ์ง์ ‘ ์ƒ์„ฑ

emplace_back ๋‚ด๋ถ€์˜ allocator_traits::construct(alloc_, ptr, args...) ๊ฐ€ ์ •ํ™•ํžˆ ์ด ์—ญํ• . ์Šฌ๋กฏ ์ฃผ์†Œ์— ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋ฟ, ํž™ ํ• ๋‹น์€ ์žฌํ• ๋‹น ์‹œ์—๋งŒ ์ผ์–ด๋‚จ.

๊ฐ€๋ณ€ ํ…œํ”Œ๋ฆฟ ์ธ์ž ์ „๋‹ฌ

Args&&... ๋กœ ์ž„์˜ ๊ฐœ์ˆ˜ ์ธ์ž๋ฅผ ๋ฐ›์•„ std::forward<Args>(args)... ๋กœ ์ƒ์„ฑ์ž์— ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ.

1
2
3
4
5
6
7
8
9
10
template<class... Args>
T& emplace_back(Args&&... args) {
    // ์Šฌ๋กฏ ์œ„์—์„œ ์ง์ ‘ ์ƒ์„ฑ
    std::allocator_traits<Alloc>::construct(
        alloc_, data_ + size_,
        std::forward<Args>(args)...   // lvalue/rvalue ์ •๋ณด ๋ณด์กดํ•ด์„œ ์ƒ์„ฑ์ž๋กœ ์ „๋‹ฌ
    );
    ++size_;
    return data_[size_ - 1];
}

Q2. push_back ์˜ lvalue / rvalue

1
2
3
4
Point p(1, 2);
v.push_back(p);             // lvalue โ†’ const T& ์˜ค๋ฒ„๋กœ๋“œ โ†’ ๋ณต์‚ฌ ์ƒ์„ฑ์ž
v.push_back(Point(1, 2));   // rvalue (์ž„์‹œ ๊ฐ์ฒด) โ†’ T&& ์˜ค๋ฒ„๋กœ๋“œ โ†’ ์ด๋™ ์ƒ์„ฑ์ž
v.push_back(std::move(p));  // ๋ช…์‹œ์  rvalue โ†’ T&& ์˜ค๋ฒ„๋กœ๋“œ โ†’ ์ด๋™ ์ƒ์„ฑ์ž

C++11 ์ด์ „์—๋Š” ๋ณต์‚ฌ๋งŒ ์žˆ์—ˆ๊ณ , C++11 ์—์„œ push_back(T&&) ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด์„œ ์ž„์‹œ ๊ฐ์ฒด๋Š” ์ด๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋จ.


Q3. push_back(โ€œAliceโ€) ๋„ ๊ฐ€๋ณ€ ํ…œํ”Œ๋ฆฟ ์•„๋‹Œ๊ฐ€?

์•„๋‹˜. push_back ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” push_back(T&&) โ€” ์ธ์ž 1๊ฐœ๋งŒ ๋ฐ›์Œ.

push_back("Alice") ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ:

1
2
3
"Alice" (const char*)
  โ†’ string("Alice") ์ž„์‹œ ๊ฐ์ฒด ์ƒ์„ฑ  โ† ์•”์‹œ์  ๋ณ€ํ™˜ ๋ฐœ์ƒ
  โ†’ ๊ทธ ์ž„์‹œ ๊ฐ์ฒด๋ฅผ ์Šฌ๋กฏ์œผ๋กœ ์ด๋™

์ค‘๊ฐ„์— ์ž„์‹œ ๊ฐ์ฒด 1๊ฐœ๊ฐ€ ์ƒ๊ธด๋‹ค. emplace_back("Alice") ๋Š” string("Alice") ๋ฅผ ์Šฌ๋กฏ์—์„œ ์ง์ ‘ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์ž„์‹œ ๊ฐ์ฒด ์—†์Œ.

์™œ T&& ๊ฐ€ ์•„๋‹ˆ๋ผ Args&&โ€ฆ ์ธ๊ฐ€

T&& ๋Š” ๋‹จ์ผ ์ธ์ž 1๊ฐœ๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ.

1
2
v.push_back(T&&);       // ์ธ์ž 1๊ฐœ โ†’ BigObject ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์•ผ ํ•จ
v.emplace_back(1, 2);   // ์ธ์ž ์—ฌ๋Ÿฌ ๊ฐœ โ†’ Point(1, 2) ์Šฌ๋กฏ์—์„œ ์ง์ ‘ ์ƒ์„ฑ

์—ฌ๋Ÿฌ ์ธ์ž๋ฅผ ์ƒ์„ฑ์ž์— ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•ด ์ž„์‹œ ๊ฐ์ฒด ์—†์ด in-place ์ƒ์„ฑํ•˜๋Š” ๊ฒŒ emplace ์˜ ๋ณธ์งˆ์ด๋ฏ€๋กœ Args&&... ๊ฐ€ ํ•„์š”ํ•จ.


Q4. v.push_back(1, 2.0, โ€œxโ€, โ€ฆ) ์„ ์“ฐ๋ฉด?

์ปดํŒŒ์ผ ์—๋Ÿฌ. push_back ์€ ์ธ์ž 1๊ฐœ๋งŒ ๋ฐ›์œผ๋ฏ€๋กœ โ€œtoo many argumentsโ€.

1
2
3
4
5
6
7
8
// โŒ ์ปดํŒŒ์ผ ์—๋Ÿฌ
v.push_back(1, 2.0, "x", std::vector<int>{1,2,3});

// โœ… ๊ฐ์ฒด๋ฅผ ๋จผ์ € ๋งŒ๋“ค์–ด์•ผ ํ•จ
v.push_back(BigObject(1, 2.0, "x", {1,2,3}));  // ์ž„์‹œ ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ์ด๋™

// โœ… ์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐํ™” (explicit ์—†๋Š” ์ƒ์„ฑ์ž์ธ ๊ฒฝ์šฐ)
v.push_back({1, 2.0, "x", {1,2,3}});

์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐํ™”๋Š” explicit ์ƒ์„ฑ์ž๊ฐ€ ์—†์„ ๋•Œ๋งŒ ๋™์ž‘. explicit ๋ถ™์–ด์žˆ์œผ๋ฉด ์ค‘๊ด„ํ˜ธ๋„ ์—๋Ÿฌ.


Q5. emplace_back ์œผ๋กœ unique_ptr ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด?

1
2
3
4
5
6
7
std::vector<std::unique_ptr<Resource>> v;

// โŒ ์œ„ํ—˜: raw new ์™€ emplace_back ์‚ฌ์ด์— ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜
v.emplace_back(new Resource("data"));

// โœ… ์•ˆ์ „
v.emplace_back(std::make_unique<Resource>("data"));

unique_ptr(T* ptr) ์ƒ์„ฑ์ž๋Š” explicit ์ด๋ผ์„œ push_back(new Resource(...)) ๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ. emplace_back ์€ explicit ์„ ์šฐํšŒํ•ด ์ง์ ‘ ํ˜ธ์ถœ ๊ฐ€๋Šฅ โ€” ยง4-1 ์˜ โ€œํ•จ์ •โ€๊ณผ ๊ฐ™์€ ๋งฅ๋ฝ.

์œ„ํ—˜ํ•œ ์ด์œ : new Resource("data") ๊ฐ€ ์„ฑ๊ณตํ–ˆ๋Š”๋ฐ emplace_back ๋‚ด๋ถ€ ์žฌํ• ๋‹น์—์„œ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ, raw ํฌ์ธํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ณณ์ด ์—†์–ด ๋ˆ„์ˆ˜๋จ. make_unique ๋Š” ํฌ์ธํ„ฐ๋ฅผ ์ฆ‰์‹œ unique_ptr ์— ๋ฌถ์œผ๋ฏ€๋กœ ์˜ˆ์™ธ ์•ˆ์ „.


Q6. vector capacity ์žฌํ• ๋‹น์€ ์ž๋™? ์ˆ˜๋™?

์™„์ „ ์ž๋™. size > capacity ๊ฐ€ ๋˜๋Š” ์ˆœ๊ฐ„ ๋‚ด๋ถ€์—์„œ ์ž๋™ ๋ฐœ๋™.

ย vector ์žฌํ• ๋‹นunordered_map rehash
ํŠธ๋ฆฌ๊ฑฐ์ž๋™ (size > capacity)์ž๋™ + ์ˆ˜๋™ (u.rehash(n))
์ˆ˜๋™ ํŠธ๋ฆฌ๊ฑฐ์—†์Œ์žˆ์Œ
ํšŒํ”ผ ๋ฐฉ๋ฒ•reserve(n)reserve(n)

reserve(n) ์œผ๋กœ ์žฌํ• ๋‹น ์‹œ์ ์„ ๋Šฆ์ถœ ์ˆ˜๋งŒ ์žˆ๊ณ , ์ง์ ‘ ๋ฐœ๋™์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Œ.


Q7. ์ฒด์ธ ๊ธธ์ด โ‰ˆ load_factor ๋œป

1
load_factor = ์›์†Œ ์ˆ˜(n) / ๋ฒ„ํ‚ท ์ˆ˜(m)

์›์†Œ๊ฐ€ ๋ฒ„ํ‚ท์— ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„ํฌ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋ฒ„ํ‚ท ํ•˜๋‚˜๋‹น ํ‰๊ท  ์›์†Œ ์ˆ˜ = n / m = load_factor.

1
2
์›์†Œ 100๊ฐœ, ๋ฒ„ํ‚ท 100๊ฐœ โ†’ load_factor 1.0 โ†’ ๋ฒ„ํ‚ท๋‹น ํ‰๊ท  1๊ฐœ โ†’ find ์‹œ ํ‰๊ท  1ํšŒ ๋น„๊ต
์›์†Œ 200๊ฐœ, ๋ฒ„ํ‚ท 100๊ฐœ โ†’ load_factor 2.0 โ†’ ๋ฒ„ํ‚ท๋‹น ํ‰๊ท  2๊ฐœ โ†’ find ์‹œ ํ‰๊ท  2ํšŒ ๋น„๊ต

์ฒด์ธ ๊ธธ์ด(ํƒ์ƒ‰ ๋น„์šฉ)๊ฐ€ load_factor ์— ๋น„๋ก€ํ•œ๋‹ค = load_factor ๋ฅผ ๋‚ฎ๊ฒŒ ์œ ์ง€ํ• ์ˆ˜๋ก ํƒ์ƒ‰์ด ๋น ๋ฅด๋‹ค.


Q8. ํ•ด์‹œ์ถฉ๋Œ์ด๋ž€? ์†Œ๋ฉธ์ž์—์„œ ํ•ด์‹œ ํ•ด์ œ๊ฐ€ ์ผ์–ด๋‚˜๋Š”๊ฐ€?

ํ•ด์‹œ์ถฉ๋Œ

hash(key) % bucket_count ๊ฒฐ๊ณผ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ํ‚ค์—์„œ ๊ฐ™์€ ๋ฒ„ํ‚ท ์ธ๋ฑ์Šค ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ. ํ•ด์‹œ๊ฐ’ ์ž์ฒด๊ฐ€ ๊ฐ™์„ ํ•„์š”๋Š” ์—†๊ณ , ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ(๋ฒ„ํ‚ท ์ธ๋ฑ์Šค)๊ฐ€ ๊ฐ™์œผ๋ฉด ์ถฉ๋Œ.

1
2
hash("foo") % 16 = 5
hash("xyz") % 16 = 5   โ† ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค, ๊ฐ™์€ ๋ฒ„ํ‚ท ์ธ๋ฑ์Šค โ†’ ํ•ด์‹œ ์ถฉ๋Œ

์†Œ๋ฉธ์ž์—์„œ ํ•ด์ œ

  • ์ฒด์ด๋‹: unordered_map ์†Œ๋ฉธ ์‹œ ๊ฐ ๋ฒ„ํ‚ท์˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋…ธ๋“œ๋“ค์„ ์ˆœํšŒํ•˜๋ฉฐ ์†Œ๋ฉธ์ž ํ˜ธ์ถœ + delete
  • ํ•ด์‹œ ํ•จ์ˆ˜ ์ž์ฒด: ํ•จ์ˆ˜์ผ ๋ฟ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†์Œ โ†’ ํ•ด์ œํ•  ๊ฒƒ ์—†์Œ
  • ์‹ค์ œ ํ•ด์ œ ๋Œ€์ƒ: ๋ฒ„ํ‚ท ๋ฐฐ์—ด + (์ฒด์ด๋‹์˜ ๊ฒฝ์šฐ) ๊ฐ ๋…ธ๋“œ

Q9. probing ์ „๋žต์ด๋ž€?

์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ์—์„œ ์ถฉ๋Œ ์‹œ ์–ด๋–ค ์ˆœ์„œ๋กœ ๋‹ค์Œ ๋นˆ ์Šฌ๋กฏ์„ ํƒ์ƒ‰ํ•˜๋Š”๊ฐ€ ์˜ ๋ฐฉ๋ฒ•.

1
2
3
4
5
6
7
8
์„ ํ˜• ํƒ์‚ฌ (Linear Probing):  +1, +2, +3 ...
  โ†’ ์บ์‹œ ์นœํ™” ์ตœ๊ฐ• (์ธ์ ‘ ์Šฌ๋กฏ), ํด๋Ÿฌ์Šคํ„ฐ๋ง ์‹ฌํ•จ

์ด์ฐจ ํƒ์‚ฌ (Quadratic Probing): +1ยฒ, +2ยฒ, +3ยฒ ...
  โ†’ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์™„ํ™”, load_factor 0.5 ์ดˆ๊ณผ ์‹œ ๋ฌดํ•œ๋ฃจํ”„ ์œ„ํ—˜

์ด์ค‘ ํ•ด์‹ฑ (Double Hashing):  +h2(k), +2ยทh2(k) ...
  โ†’ ๋ถ„ํฌ ๊ฐ€์žฅ ๊ท ๋“ฑ, ํ•ด์‹œ ํ•จ์ˆ˜ 2๋ฒˆ ๊ณ„์‚ฐ ๋น„์šฉ

๋ฐฐ์—ด ์•ˆ์—์„œ ํƒ์ƒ‰ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ทœ์น™ = probing ์ „๋žต.


Q10. โ€œnext ํฌ์ธํ„ฐ ๋ถˆํ•„์š”โ€ โ€” ํ•ด์‹œ์— next ๊ฐ€ ์žˆ์ง€ ์•Š์€๊ฐ€?

์ฒด์ด๋‹ ๊ณผ ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ ์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ. next ํฌ์ธํ„ฐ๋Š” ์ฒด์ด๋‹์—๋งŒ ์žˆ์Œ.

1
2
3
4
5
6
7
// ์ฒด์ด๋‹ (Separate Chaining) โ€” next ์žˆ์Œ
struct Node { Key k; Value v; Node* next; };
// buckets[i] ๋Š” Node* (์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ํ—ค๋“œ)

// ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ (Open Addressing) โ€” next ์—†์Œ
struct Slot { Key k; Value v; bool occupied; };
// buckets[i] ๋Š” Slot (๊ฐ’ ์ง์ ‘ ์ €์žฅ)

โ€œ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์Œ โ€” next ํฌ์ธํ„ฐ ๋ถˆํ•„์š”โ€ ๋Š” ์˜คํ”ˆ ์–ด๋“œ๋ ˆ์‹ฑ ์˜ ์žฅ์ ์„ ์„ค๋ช…ํ•œ ๊ฒƒ. ์ฒด์ด๋‹์˜ next ํฌ์ธํ„ฐ์™€๋Š” ๋‹ค๋ฅธ ์–˜๊ธฐ.


Q11. reserve ๋กœ iterator ๋ฌดํšจํ™” ํšŒํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•

1
2
3
4
5
6
7
8
9
10
11
12
std::vector<int> v;
v.reserve(1000);      // capacity = 1000, size = 0

int* ptr = v.data();  // ํฌ์ธํ„ฐ ์ €์žฅ

for (int i = 0; i < 1000; i++) {
    v.push_back(i);   // size <= capacity โ†’ ์žฌํ• ๋‹น ์—†์Œ โ†’ ptr ์—ฌ์ „ํžˆ ์œ ํšจ
}

// 1001๋ฒˆ์งธ push_back โ†’ size > capacity โ†’ ์žฌํ• ๋‹น ๋ฐœ์ƒ โ†’ ptr ๋Œ•๊ธ€๋ง!
v.push_back(1001);
// ์ด์ œ ptr ์€ ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ด (UB)

ํ•ต์‹ฌ: reserve ํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์•ˆ์ „. ๊ทธ ๋ฒ”์œ„๋ฅผ ๋„˜๋Š” ์ˆœ๊ฐ„ ์žฌํ• ๋‹น์ด ๋ฐœ์ƒํ•˜๊ณ  ๋ชจ๋“  iteratorยทํฌ์ธํ„ฐยท์ฐธ์กฐ๊ฐ€ ๋ฌดํšจํ™”๋จ.

์‹ค์ „ ํŒจํ„ด:

1
2
3
4
5
std::vector<Obj> v;
v.reserve(expected_size);  // ์˜ˆ์ƒ ํฌ๊ธฐ ๋ฏธ๋ฆฌ ํ™•๋ณด

for (auto& item : source)
    v.emplace_back(item);  // ์žฌํ• ๋‹น 0ํšŒ โ€” iterator ์•ˆ์ „

Q12. vector ์—์„œ emplace_back ์„ ์“ฐ๋ฉด ํ•ด์‹œ ์ถฉ๋Œ์ด ์•ˆ ์ผ์–ด๋‚˜๋Š”๊ฐ€?

์ „ํ˜€ ๋ฌด๊ด€ํ•œ ๊ฐœ๋…์ด๋‹ค.

ย std::vectorstd::unordered_map
๋‚ด๋ถ€ ๊ตฌ์กฐ์—ฐ์† ๋ฐฐ์—ด๋ฒ„ํ‚ท ๋ฐฐ์—ด + ํ•ด์‹œ ํ•จ์ˆ˜
ํ‚ค ๊ฐœ๋…์—†์Œ (์ธ๋ฑ์Šค ์ ‘๊ทผ)์žˆ์Œ (key โ†’ hash โ†’ bucket)
์ถฉ๋Œ ๊ฐœ๋…์—†์Œ์žˆ์Œ
์›์†Œ ์ถ”๊ฐ€push_back / emplace_backinsert / emplace
1
2
3
4
5
6
7
// vector โ€” ํ•ด์‹œ ์—†์Œ, ์ถฉ๋Œ ์—†์Œ
std::vector<int> v;
v.emplace_back(42);     // ์Šฌ๋กฏ[size] ์— 42 ์ง์ ‘ ์ƒ์„ฑ. ๋.

// unordered_map โ€” ํ•ด์‹œ ์žˆ์Œ, ์ถฉ๋Œ ๊ฐ€๋Šฅ
std::unordered_map<std::string, int> m;
m.emplace("foo", 1);    // hash("foo") % N โ†’ ๋ฒ„ํ‚ท ์„ ํƒ โ†’ ์ถฉ๋Œ ์—ฌ๋ถ€ ํ™•์ธ

unordered_map ์—๋„ emplace ๊ฐ€ ์žˆ์ง€๋งŒ emplace_back ๊ณผ ๋‹ค๋ฅธ ํ•จ์ˆ˜. emplace_back ์€ vectorยทdeque ๊ฐ™์€ ์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ ์—๋งŒ ์žˆ์Œ.

๋‘ ๊ฐœ๋…์ด ๊ฐ™์€ ํŒŒ์ผ์— ๋ฌถ์ธ ์ด์œ 

์ถฉ๋Œ์ด ์—ฐ๊ด€๋œ ๊ฒŒ ์•„๋‹ˆ๋ผ ์žฌํ™•์žฅ ํŒจํ„ด์ด ๊ฐ™์•„์„œ ๋น„๊ตํ•œ ๊ฒƒ:

1
2
3
4
5
6
vector ์žฌํ• ๋‹น     โ†”    unordered_map rehash
size > capacity        load_factor > max_load_factor
์ƒˆ ๋ฐฐ์—ด + ์ „์ฒด ์ด๋™     ์ƒˆ ๋ฒ„ํ‚ท + ์ „์ฒด ์žฌ๋ฐฐ์น˜
O(n) ๋น„์šฉ             O(n) ๋น„์šฉ
iterator ์ „๋ถ€ ๋ฌดํšจํ™”    iterator ์ „๋ถ€ ๋ฌดํšจํ™”
reserve(n) ๋กœ ํšŒํ”ผ     reserve(n) ๋กœ ํšŒํ”ผ
์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

ยฉ GoldBoll. ์ผ๋ถ€ ๊ถŒ๋ฆฌ ๋ณด์œ 

Powered by Jekyll with Chirpy theme

์ธ๊ธฐ ํƒœ๊ทธ