ํฌ์ŠคํŠธ

๐ŸŒ’ The Swap Trick

๐Ÿ’Ž The Swap Trick : ๋ฉ”๋ชจ๋ฆฌ ์žฌํ• ๋‹น


์ฐธ๊ณ 0
์ฐธ๊ณ 1
์ฐธ๊ณ 2 ์ฐธ๊ณ 3

์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ์ข‹์€ ์ฝ”๋“œ๋‹ค์˜ 84p ์—์„œ ์–ธ๊ธ‰๋œ The Swap Trick.
์•„๋ž˜๋Š” ์ฑ…์— ๋‚˜์˜จ ์˜ˆ์ œ ์ฝ”๋“œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
struct Recorder
{
	vector<float> data;
	...
	void Clear()
	{
		vector<float>().swap(data);
		// ๋ญ? ๊ทธ๋ƒฅ data.clear() ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ๋ญ์ง€?
	}
}

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ฃผ์„์— ์ ํžŒ ๋ง์ฒ˜๋Ÿผ ๋‹จ์ˆœํžˆ data.clear() ํ˜ธ์ถœํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์€๋ฐ,
๋นˆ ๋ฒกํ„ฐ (vector()) ์™€ swap ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.

์ด๋Š” โ€˜์ž˜ ์•Œ๋ ค์ง€์ง€ ์•Š์€ C++ ์–ธ์–ด ํŠน์œ ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ ใ…ก ์ €์ž์— ๋”ฐ๋ฅด๋ฉดโ€™ ์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

vector.clear()๋Š” vector ์•ˆ์— ์ €์žฅ๋œ ๊ฐ’๋“ค์€ ์ œ๊ฑฐ์‹œ์ผœ์ฃผ์ง€๋งŒ,
vector์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•ด์ œ๋˜์ง€ ์•Š๋Š”๋‹ค!

๋•Œ๋ฌธ์— ๊ฐ•์ œ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ฃผ๊ธฐ ์œ„ํ•ด,
๋นˆ vector์™€ swap์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์Šค์ฝ”ํ”„๊ฐ€ ๋๋‚˜๋Š” ์‹œ์ ์—๋Š” ์ž๋™์œผ๋กœ ํž™์—์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์—,
๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” vector๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ด๋ ‡๊ฒŒ ์“ธ ํ•„์š”๋Š” ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ฑ…์—์„œ ๋‚˜์˜ค๋Š” The Swap Trick ์€ ์ด๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ ๊ฐ™๊ณ ,
๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ ๋‹ค๋ฅธ ๊ฒƒ๋„ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

1
vector<float>(data).swap(data);

์ด๋ ‡๊ฒŒ ๊ฐ™์€ vector๋ฅผ ๊ทธ๋Œ€๋กœ swap ํ•ด์ฃผ๋ฉด,
vector๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋”ฑ ์ €์žฅ๋œ ์š”์†Œ๋“ค๋งŒํผ๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

๋ฌด์Šจ ๋ง์ด๋ƒ ํ•˜๋ฉด,

vector๋Š” ์šฉ๋Ÿ‰์ด ๊ฝ‰ ์ฐผ์„๋•Œ ์Šค์Šค๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฌํ• ๋‹นํ•˜์—ฌ ์ผ์ • ๋น„์œจ๋กœ ํฌ๊ธฐ๋ฅผ ํ‚ค์šฐ๋Š”๋ฐ,
์ด๋•Œ ์ปค์ง„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์ƒ, ๋‚ญ๋น„๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.

๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ The Swap Trick์„ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•œ๋‹ค.
์ด๋Š” vector ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ string, deque ๊ฐ™์ด ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๋Ÿ‰์ด ๋ฐ”๋€Œ๋Š” ์นœ๊ตฌ๋“ค์—๊ฒŒ๋„ ์ ์šฉ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

C++ 11 ์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” shrink_to_fit() ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ,
์ด๋„ ์ƒˆ๋กœ์šด vector๋ฅผ ๋งŒ๋“ค๊ณ , ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด๊ธฐ์—,
ํฐ vector์— ๋Œ€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, CPU ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ•œ ๋ฒˆ ๊ณ ๋ฏผํ•ด๋ด์•ผ ํ•œ๋‹ค.

๋˜, ๋ฐฉ๊ธˆ ์–ธ๊ธ‰ํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ ๊ณผ๋„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ์—,
shrink_to_fit() ํ•จ์ˆ˜๋Š” non-binding ํ•จ์ˆ˜ (๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„๋˜์ง€๋Š” ์•Š๋Š”) ์ด๋ผ๊ณ  ํ•œ๋‹ค.
๋•Œ๋ฌธ์— ์ด์ „์— ์‚ฌ์šฉํ•˜๋˜ ์ปดํŒŒ์ผ๋Ÿฌ์™€์˜ ํ˜ธํ™˜์„ฑ ์—ญ์‹œ ์ƒ๊ฐํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.