ํƒœ๊ทธ ๋ณด๊ด€๋ฌผ: stdmap

stdmap

์ง€๋„์— ์‚ฝ์ž…ํ•˜๋Š” ๋ฐ ์„ ํ˜ธ๋˜๋Š” / ๊ด€์šฉ์  ์ธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค std::map. std::map<int,

์— ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋„ค ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค std::map.

std::map<int, int> function;

function[0] = 42;
function.insert(std::map<int, int>::value_type(0, 42));
function.insert(std::pair<int, int>(0, 42));
function.insert(std::make_pair(0, 42));

๊ทธ ์ค‘ ์–ด๋А ๊ฒƒ์ด ์„ ํ˜ธ๋˜๋Š” / ๊ด€์šฉ์  ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๊นŒ? (๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?)



๋‹ต๋ณ€

์šฐ์„ , operator[]๋ฐ insert๋ฉค๋ฒ„ ํ•จ์ˆ˜๋Š” ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค :

  • ๋Š” operator[]๊ฒƒ์ž…๋‹ˆ๋‹ค ๊ฒ€์ƒ‰ ํ‚ค์˜ ์‚ฝ์ž… ๊ธฐ๋ณธ ๊ตฌ์„ฑ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” ๊ฐ’์„, ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์ด ๊ฐ’์„ ์ง€์ •ํ•˜๋Š”์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. mapped_type๊ธฐ๋ณธ ๊ตฌ์„ฑ ๋ฐ ํ• ๋‹น ๋Œ€์‹  ์ง์ ‘ ์ดˆ๊ธฐํ™”๋˜๋Š” ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๊ฒƒ์€ ๋น„ํšจ์œจ์  ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฝ์ž…์ด ์‹ค์ œ๋กœ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๋˜๋Š” ์ด์ „์— ์‚ฝ์ž… ๋œ ํ‚ค์˜ ๊ฐ’๋งŒ ๋ฎ์–ด ์ผ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • insert๋ฉค๋ฒ„ ํ•จ์ˆ˜๋Š” ์ข…์ข… ์žŠ๊ณ  ์žˆ์ง€๋งŒ, ํ‚ค๊ฐ€ ์ด๋ฏธ ๋งต์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ๊ฒƒ, ๋ฐ˜ํ™˜ std::pair<iterator, bool>๊ด€์‹ฌ์ด์žˆ์„ ์ˆ˜์žˆ๋Š”๊ฐ€ (์‚ฝ์ž… ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ ๋œ ๊ฒฝ์šฐ ํŠนํžˆ ๊ฒฐ์ •).

๋‚˜์—ด๋œ ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์—์„œ๋ฅผ ํ˜ธ์ถœ insertํ•˜๋ฉด ์„ธ ๊ฐ€์ง€ ๋ชจ๋‘ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ insertํ‘œ์ค€ ์—์„œ ์„œ๋ช…์„ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค .

typedef pair<const Key, T> value_type;

  /* ... */

pair<iterator, bool> insert(const value_type& x);

๊ทธ๋ ‡๋‹ค๋ฉด ์„ธ ํ˜ธ์ถœ์€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”?

  • std::make_pairํ…œํ”Œ๋ฆฟ ์ธ์ˆ˜ ๊ณต์ œ์— ์˜์กดํ•˜๊ณ  ์žˆ์—ˆ๋‹ค (์ด ๊ฒฝ์šฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค ) ์‹ค์ œ์™€๋Š” ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์ƒ์‚ฐ ๋ฌด์–ธ๊ฐ€ value_type์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ํ˜ธ์ถœ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค์ง€๋„์˜ std::pair๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ์ž value_type(์˜ˆ : ์ถ”๊ฐ€ const๋กœ first_type)
  • std::pair<int, int>๋˜ํ•œ์˜ ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ์ž์— ์ถ”๊ฐ€ ํ˜ธ์ถœ์„ ํ•„์š” std::pair๋กœ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด value_type(์˜ˆ : ์ถ”๊ฐ€ const๋กœ first_type)
  • std::map<int, int>::value_typeinsert๋ฉค๋ฒ„ ํ•จ์ˆ˜์—์„œ ์˜ˆ์ƒํ•˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜ ์œ ํ˜•์ด๋ฏ€๋กœ ์˜์‹ฌ ํ•  ์—ฌ์ง€๊ฐ€ ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค .

๊ฒฐ๊ตญ operator[]๊ธฐ๋ณธ ์ƒ์„ฑ ๋ฐ ํ• ๋‹น์— ์ถ”๊ฐ€ ๋น„์šฉ์ด์—†๊ณ  mapped_type์ƒˆ ํ‚ค๊ฐ€ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฝ์ž…๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ํ•œ, ๋ชฉ์ ์ด ์‚ฝ์ž… ์ผ ๋•Œ ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค . ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ inserta๋ฅผ ๋งŒ๋“œ๋Š” value_type๊ฒƒ์ด ์•„๋งˆ๋„ ๊ฐˆ ๊ธธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋‹ต๋ณ€

C ++ 11๋ถ€ํ„ฐ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ถ”๊ฐ€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € insert()๋ชฉ๋ก ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

function.insert({0, 42});

์ด๊ฒƒ์€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

function.insert(std::map<int, int>::value_type(0, 42));

๊ทธ๋Ÿฌ๋‚˜ ํ›จ์”ฌ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋‹ต๋ณ€์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ํ˜•์‹์— ๋น„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • operator[]์ ‘๊ทผ ๋ฐฉ์‹์€ ํ•ญ์ƒ ๊ทธ๋Ÿฐ ๊ฒƒ์€ํ•˜์ง€ ์•Š์€, ํ• ๋‹น ํ•  ๋งคํ•‘ ์œ ํ˜•์„ ํ•„์š”๋กœํ•œ๋‹ค.
  • ์ด operator[]์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ธฐ์กด ์š”์†Œ๋ฅผ ๋ฎ์–ด ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • insert๋‚˜์—ดํ•œ ๋‹ค๋ฅธ ํ˜•์‹์€ ์•”์‹œ ์  ํ˜•์‹ ๋ณ€ํ™˜์„ ํฌํ•จํ•˜๋ฏ€๋กœ ์ฝ”๋“œ ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ํฐ ๋‹จ์ ์€์ด ์–‘์‹์ด ํ‚ค์™€ ๊ฐ’์„ ๋ณต์‚ฌ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— unique_ptr๊ฐ’์ด ์žˆ๋Š” ๋งต์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค . ์ด๋Š” ํ‘œ์ค€์—์„œ ์ˆ˜์ •๋˜์—ˆ์ง€๋งŒ ์•„์ง ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„์— ๋„๋‹ฌํ•˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘˜์งธ, ๋‹ค์Œ emplace()๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

function.emplace(0, 42);

์ด๊ฒƒ์€์˜ ์–ด๋–ค ํ˜•ํƒœ๋ณด๋‹ค ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  insert(), ๊ฐ™์€ ์ด๋™ ์ „์šฉ ์œ ํ˜•์—์„œ ์ž˜ ์ž‘๋™ unique_ptrํ•˜๋ฉฐ ์ด๋ก ์ ์œผ๋กœ๋Š” ์•ฝ๊ฐ„ ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๊ดœ์ฐฎ์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ฐจ์ด๋ฅผ ์ตœ์ ํ™”ํ•ด์•ผํ•˜์ง€๋งŒ). ์œ ์ผํ•œ ์ฃผ์š” ๋‹จ์ ์€ emplace๋ฐฉ๋ฒ•์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋…์ž๋ฅผ ์•ฝ๊ฐ„ ๋†€๋ผ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋‹ต๋ณ€

์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „ :

function[0] = 42; // version 1

๊ฐ’ 42๋ฅผ ๋งต์— ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์‚ฝ์ž…ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค 0๊ฐ€ ์žˆ์œผ๋ฉด ํ•ด๋‹น ํ‚ค์— 42๋ฅผ ํ• ๋‹นํ•˜์—ฌ ํ•ด๋‹น ํ‚ค์˜ ๊ฐ’์„ ๋ฎ์–ด ์”๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ‚ค / ๊ฐ’ ์Œ์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

์‚ฝ์ž… ๊ธฐ๋Šฅ :

function.insert(std::map<int, int>::value_type(0, 42));  // version 2
function.insert(std::pair<int, int>(0, 42));             // version 3
function.insert(std::make_pair(0, 42));                  // version 4

๋ฐ˜๋ฉด์— ํ‚ค๊ฐ€ 0์ด๋ฏธ ๋งต์—์žˆ๋Š” ๊ฒฝ์šฐ ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค . ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ํ‚ค / ๊ฐ’ ์Œ์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

์„ธ ๊ฐ€์ง€ ์‚ฝ์ž… ๊ธฐ๋Šฅ์€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. std::map<int, int>::value_type๋Š” IS typedef์— ๋Œ€ํ•œ std::pair<const int, int>, ๊ทธ๋ฆฌ๊ณ  std::make_pair()๋ถ„๋ช…ํžˆ์„ ์ƒ์‚ฐ std::pair<>ํ…œํ”Œ๋ฆฟ ๊ณต์ œ ๋งˆ๋ฒ•์„ ํ†ตํ•ด. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋ฒ„์ „ 2, 3 ๋ฐ 4์—์„œ ๋™์ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์–ด๋А ๊ฒƒ์„ ์‚ฌ์šฉํ• ๊นŒ์š”? ๊ฐœ์ธ์ ์œผ๋กœ ๋ฒ„์ „ 1์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๊ฒฐํ•˜๊ณ  โ€œ์ž์—ฐ ์Šค๋Ÿฝ๋‹คโ€. ๊ทธ ๋ฎ์–ด ์“ฐ๊ธฐ ํ–‰๋™์ด ์š”๊ตฌ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” ๋‹จ์ผ์ด ๋‚˜๋„ ๋ชฐ๋ผ ๋ฒ„์ „ 2์™€ 3 ๋ฏธ๋งŒ์˜ ์ž…๋ ฅ์„ ํ•„์š”๋กœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌผ๋ก , ๊ทธ๋•Œ๋Š” ๋ฒ„์ „ 4๋ฅผ ์„ ํ˜ธ ์‚ฌ์‹ค์ƒ ์— ํ‚ค / ๊ฐ’ ์Œ์„ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ• std::map.

์ƒ์„ฑ์ž ์ค‘ ํ•˜๋‚˜๋ฅผ ํ†ตํ•ด ๋งต์— ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• :

std::map<int, int> quadratic_func;

quadratic_func[0] = 0;
quadratic_func[1] = 1;
quadratic_func[2] = 4;
quadratic_func[3] = 9;

std::map<int, int> my_func(quadratic_func.begin(), quadratic_func.end());

๋‹ต๋ณ€

ํ‚ค 0์œผ๋กœ ์š”์†Œ๋ฅผ ๋ฎ์–ด ์“ฐ๋ ค๋ฉด

function[0] = 42;

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

function.insert(std::make_pair(0, 42));

๋‹ต๋ณ€

C ++ 17 std::map ์€ ๋‘ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ์‚ฝ์ž… ๋ฐฉ๋ฒ•์„ ์ œ๊ณต ํ•˜๊ธฐ ๋•Œ๋ฌธ์— sp2danny ์˜ ์ฃผ์„ ์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด insert_or_assign()๋ฐ .try_emplace()

insert_or_assign()

๊ธฐ๋ณธ์ ์œผ๋กœ์€ insert_or_assign()์˜ โ€œ๊ฐœ์„  ๋œโ€๋ฒ„์ „์ž…๋‹ˆ๋‹ค operator[]. ๋Œ€์กฐ์ ์œผ๋กœ operator[], insert_or_assign()๊ธฐ๋ณธ ์ž‘๋„ ๋ ์ง€๋„์˜ ๊ฐ’ ์œ ํ˜•์„ ํ•„์š”๋กœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ์ฝ”๋“œ๋Š” MyClass๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

class MyClass {
public:
    MyClass(int i) : m_i(i) {};
    int m_i;
};

int main() {
    std::map<int, MyClass> myMap;

    // VS2017: "C2512: 'MyClass::MyClass' : no appropriate default constructor available"
    // Coliru: "error: no matching function for call to 'MyClass::MyClass()"
    myMap[0] = MyClass(1);

    return 0;
}

๊ทธ๋Ÿฌ๋‚˜ myMap[0] = MyClass(1);๋‹ค์Œ ์ค„๋กœ ๋ฐ”๊พธ๋ฉด ์ฝ”๋“œ๊ฐ€ ์ปดํŒŒ์ผ๋˜๊ณ  ์˜๋„ ํ•œ๋Œ€๋กœ ์‚ฝ์ž…์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

myMap.insert_or_assign(0, MyClass(1));

๋˜ํ•œ, ์œ ์‚ฌ insert(), insert_or_assign()๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค pair<iterator, bool>. ๋ถ€์šธ ๊ฐ’์€ true์‚ฝ์ž…์ด ๋ฐœ์ƒํ•œ false๊ฒฝ์šฐ์™€ ํ• ๋‹น์ด ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๊ธฐ๋Š” ์‚ฝ์ž… ๋˜๋Š” ์—…๋ฐ์ดํŠธ ๋œ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌ ํ‚ต๋‹ˆ๋‹ค.

try_emplace()

์œ„์™€ ์œ ์‚ฌํ•˜๊ฒŒ์˜ try_emplace()โ€œ๊ฐœ์„ โ€์ž…๋‹ˆ๋‹ค emplace(). ๋Œ€์กฐ์ ์œผ๋กœํ•˜๋Š” emplace(), try_emplace()์‚ฝ์ž…์€ ์ด๋ฏธ ๋งต์— ์กด์žฌํ•˜๋Š” ํ‚ค ๋•Œ๋ฌธ์— ์‹คํŒจ ํ•  ๊ฒฝ์šฐ ์ธ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋งต์— ์ด๋ฏธ ์ €์žฅ๋œ ํ‚ค๋กœ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค (* ์ฐธ์กฐ).

int main() {
    std::map<int, std::unique_ptr<MyClass>> myMap2;
    myMap2.emplace(0, std::make_unique<MyClass>(1));

    auto pMyObj = std::make_unique<MyClass>(2);
    auto [it, b] = myMap2.emplace(0, std::move(pMyObj));  // *

    if (!b)
        std::cout << "pMyObj was not inserted" << std::endl;

    if (pMyObj == nullptr)
        std::cout << "pMyObj was modified anyway" << std::endl;
    else
        std::cout << "pMyObj.m_i = " << pMyObj->m_i <<  std::endl;

    return 0;
}

์ถœ๋ ฅ (์ตœ์†Œ VS2017 ๋ฐ Coliru์˜ ๊ฒฝ์šฐ) :

pMyObj๊ฐ€ ์‚ฝ์ž…๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
pMyObj๊ฐ€ ์–ด์จŒ๋“  ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณด์‹œ๋‹ค์‹œํ”ผ๋Š” pMyObj๋” ์ด์ƒ ์›๋ž˜ ๊ฐœ์ฒด๋ฅผ ๊ฐ€๋ฆฌ ํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ auto [it, b] = myMap2.emplace(0, std::move(pMyObj));๋‹ค์Œ ์ฝ”๋“œ๋กœ ๋Œ€์ฒดํ•˜๋ฉด pMyObj๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€ ๋˜๋ฏ€๋กœ ์ถœ๋ ฅ์ด ๋‹ค๋ฅด๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค .

auto [it, b] = myMap2.try_emplace(0, std::move(pMyObj));

์‚ฐ์ถœ:

pMyObj๊ฐ€ ์‚ฝ์ž…๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
pMyObj pMyObj.m_i = 2

Coliru์˜ ์ฝ”๋“œ

์ฐธ๊ณ  :์ด ๋‹ต๋ณ€์— ๋งž๊ฒŒ ์„ค๋ช…์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์งง๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ณ  ํฌ๊ด„์  ์ธ ์„ค๋ช… ์„ ์œ„ํ•ด Fluent C ++ ์— ๋Œ€ํ•œ ์ด ๊ธฐ์‚ฌ ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค .


๋‹ต๋ณ€

์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ๋ฒ„์ „ ๊ฐ„์˜ ์‹œ๊ฐ„ ๋น„๊ต๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

function[0] = 42;
function.insert(std::map<int, int>::value_type(0, 42));
function.insert(std::pair<int, int>(0, 42));
function.insert(std::make_pair(0, 42));

์ธ์„œํŠธ ๋ฒ„์ „ ๊ฐ„์˜ ์‹œ๊ฐ„ ์ฐจ์ด๊ฐ€ ์ž‘๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

#include <map>
#include <vector>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace boost::posix_time;
class Widget {
public:
    Widget() {
        m_vec.resize(100);
        for(unsigned long it = 0; it < 100;it++) {
            m_vec[it] = 1.0;
        }
    }
    Widget(double el)   {
        m_vec.resize(100);
        for(unsigned long it = 0; it < 100;it++) {
            m_vec[it] = el;
        }
    }
private:
    std::vector<double> m_vec;
};


int main(int argc, char* argv[]) {



    std::map<int,Widget> map_W;
    ptime t1 = boost::posix_time::microsec_clock::local_time();
    for(int it = 0; it < 10000;it++) {
        map_W.insert(std::pair<int,Widget>(it,Widget(2.0)));
    }
    ptime t2 = boost::posix_time::microsec_clock::local_time();
    time_duration diff = t2 - t1;
    std::cout << diff.total_milliseconds() << std::endl;

    std::map<int,Widget> map_W_2;
    ptime t1_2 = boost::posix_time::microsec_clock::local_time();
    for(int it = 0; it < 10000;it++) {
        map_W_2.insert(std::make_pair(it,Widget(2.0)));
    }
    ptime t2_2 = boost::posix_time::microsec_clock::local_time();
    time_duration diff_2 = t2_2 - t1_2;
    std::cout << diff_2.total_milliseconds() << std::endl;

    std::map<int,Widget> map_W_3;
    ptime t1_3 = boost::posix_time::microsec_clock::local_time();
    for(int it = 0; it < 10000;it++) {
        map_W_3[it] = Widget(2.0);
    }
    ptime t2_3 = boost::posix_time::microsec_clock::local_time();
    time_duration diff_3 = t2_3 - t1_3;
    std::cout << diff_3.total_milliseconds() << std::endl;

    std::map<int,Widget> map_W_0;
    ptime t1_0 = boost::posix_time::microsec_clock::local_time();
    for(int it = 0; it < 10000;it++) {
        map_W_0.insert(std::map<int,Widget>::value_type(it,Widget(2.0)));
    }
    ptime t2_0 = boost::posix_time::microsec_clock::local_time();
    time_duration diff_0 = t2_0 - t1_0;
    std::cout << diff_0.total_milliseconds() << std::endl;

    system("pause");
}

์ด๊ฒƒ์€ ๋ฒ„์ „์— ๋Œ€ํ•ด ๊ฐ๊ฐ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (ํŒŒ์ผ์„ 3 ๋ฒˆ ์‹คํ–‰ ํ–ˆ์œผ๋ฏ€๋กœ ๊ฐ๊ฐ์— ๋Œ€ํ•ด 3 ๊ฐœ์˜ ์—ฐ์† ์‹œ๊ฐ„ ์ฐจ์ด๊ฐ€ ์žˆ์Œ).

map_W.insert(std::pair<int,Widget>(it,Widget(2.0)));

2198ms, 2078ms, 2072ms

map_W_2.insert(std::make_pair(it,Widget(2.0)));

2290ms, 2037ms, 2046ms

 map_W_3[it] = Widget(2.0);

2592ms, 2278ms, 2296ms

 map_W_0.insert(std::map<int,Widget>::value_type(it,Widget(2.0)));

2234ms, 2031ms, 2027ms

๋”ฐ๋ผ์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์„œํŠธ ๋ฒ„์ „ ๊ฐ„์˜ ๊ฒฐ๊ณผ๋Š” ๋ฌด์‹œ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๊ฐ€์„ค โ€‹โ€‹ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ)!

์ด map_W_3[it] = Widget(2.0);๋ฒ„์ „์€ ์œ„์ ฏ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•œ ์ดˆ๊ธฐํ™”๋กœ ์ธํ•ด์ด ์˜ˆ์ œ์—์„œ ์•ฝ 10-15 % ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.


๋‹ต๋ณ€

๊ฐ„๋‹จํžˆ ๋งํ•ด, []์—ฐ์‚ฐ์ž๋Š” ๊ฐ’ ์œ ํ˜•์˜ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ ํ•œ ๋‹ค์Œ ์ƒˆ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” insert()๋ฐ ๋” ํšจ์œจ์ ์ด๋ฉฐ ๊ฐ’์„ ์ถ”๊ฐ€ ํ•˜๋Š” ๋ฐ ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

ํšจ๊ณผ์ ์ธ STL ์—์„œ ์ธ์šฉ ๋œ ์Šค ๋‹ˆํŽซ : Scott Meyers ์˜ ํ‘œ์ค€ ํ…œํ”Œ๋ฆฟ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์„ ๊ฐœ์„ ํ•˜๋Š” 50 ๊ฐ€์ง€ ํŠน์ • ๋ฐฉ๋ฒ• , ํ•ญ๋ชฉ 24๊ฐ€ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

template<typename MapType, typename KeyArgType, typename ValueArgType>
typename MapType::iterator
insertKeyAndValue(MapType& m, const KeyArgType&k, const ValueArgType& v)
{
    typename MapType::iterator lb = m.lower_bound(k);

    if (lb != m.end() && !(m.key_comp()(k, lb->first))) {
        lb->second = v;
        return lb;
    } else {
        typedef typename MapType::value_type MVT;
        return m.insert(lb, MVT(k, v));
    }
}

์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด์—†๋Š” ๋ฒ„์ „์„ ์„ ํƒํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์š”์ ์€์ด ํŒจ๋Ÿฌ๋‹ค์ž„ ( โ€˜์ถ”๊ฐ€โ€™์™€ โ€˜์—…๋ฐ์ดํŠธโ€™๋ฅผ ๊ตฌ๋ณ„)์ด ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


์ด ๊ธ€์€ C++ ์นดํ…Œ๊ณ ๋ฆฌ์— ๋ถ„๋ฅ˜๋˜์—ˆ๊ณ  , , , , ํƒœ๊ทธ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋‹˜์— ์˜ํ•ด ์— ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.