getline()
์ฌ์ฉ ์ ์cin
๊ฐ์ฒด๋ฅผ ํตํ ์ ๋ ฅ์ ์ฌ์ฉํ๋ค๋ฉดcin.ignore()
๊ผญ ํด์ฃผ๊ธฐint N; cin >> N; cin.ignore() string s; getline(cin, s);
char
ํ์ ์ ์ซ์๋ฅผ์ ์ํ
์ผ๋ก ๋ณํchar character = '1'; int integer = character-'0'; // float, double, long, long long ๋ชจ๋ ๊ฐ๋ฅ (์ ์ ๊ฐ์ด ์บ์คํ ๋๋๊ฒ)
vector
๋ฅผ ํ์ฉํ ์ด์ฐจ์ ๋ฐฐ์ด ๋ง๋ค๊ธฐint COL = ์ธ๋ก๊ธธ์ด(์ด), ROW = ๊ฐ๋ก๊ธธ์ด(ํ) vector<vector<int>> brd(COL, vector<int>(ROW)); // `vector<T> vector(size, val=T())`๋ฅผ ์ค์ฒฉ
fill()
์ ํ์ฉํด ์ฃผ์ด์ง ๋ฒกํฐ๋ ๋ฐฐ์ด์ ์ด๊ธฐํ (์ผ๋ถ ์์ ๋ ๊ฐ๋ฅ)fill(iter, iter, val); // ์ดํฐ๋ ์ดํฐ ๋ ๊ฐ๋ฅผ ๋ฐ์์, [inclusive, exclusive) ์์ญ์ val์ ์ฑ์ด๋ค int arr[3] = {3, 6, 9}; // ์๋ก ์ ์ธํ ์ ์๋ค๋ฉด ๋ฒกํฐ๋ฅผ ์ฐ๋ฉด ๋๋๋ฐ, ๋ฌธ์ ์์ ๋ฐฐ์ด์ด ์ฃผ์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ์๋ค fill(arr, arr+3, 0); // arr = {0, 0, 0} vector<int> vec(7, 3); fill(vec.begin()+2, vec.begin()+5, 6); // vec = {3, 3, 6, 6, 6, 3, 3}
stringstream
ํด๋์ค์getline()
ํจ์๋ฅผ ํ์ฉํ splitstring str = "hello, world!"; stringstream ss(str); while (getline(ss, str, ' ')) { cout << str << '\n'; // str ๋ณ์๋ฅผ ์ฌํ์ฉ // getline() ํจ์์ ์ธ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ `๋ฐ๋์` char ํ์ ์ด์ด์ผ ํจ (๋ณต์กํ delim ๋ถ๊ฐ) }
split()
๊ตฌํ์ฒดvector<string> split(string str, string delim) { str.erase(str.find_last_not_of(" \t\n\r\f\v")+1); // ๋ค์ชฝ ๊ณต๋ฐฑ ์ฒ๋ฆฌ๋ฅผ ์ํ right-trim vector<string> ret; size_t fr = 0, rr = str.find(delim); // ๊ธฐ๋ฅ์ ์ฐจ์ด๋ ์์ง๋ง int๋ฅผ ์ฐ๋ฉด ์ปดํ์ผ warning while (rr != string::npos) { if (fr != rr) ret.push_back(str.substr(fr, rr - fr)); // delim์ด ์ฐ๋ฌ์ ๋์ค๋ ์ผ์ด์ค ๋์ fr = rr + delim.size(); rr = str.find(delim, fr); } ret.push_back(str.substr(fr)); // delim์ด ํ๋๋ ์์ ๊ฒฝ์ฐ ์ ์ฒด๋ฅผ, ์๋ค๋ฉด ๋ง์ง๋ง ๋ฉ์ด๋ฆฌ๋ฅผ ๋ด์์ค return ret; } // delimiter๋ก ๋ค์ํ ํํ์ ๋ฌธ์์ด์ ์ฌ์ฉํ ์ ์๋ค
- ๋นํธ๋ง์คํน ๋ฐฐ์ด๊ณผ
next_permutation()
์ ํ์ฉํ ์กฐํฉ ์ฐพ๊ธฐvector<int> num{1, 2, 3, 4, 5, 6, 7, 8, 9}, idx{0, 0, 0, 0, 0, 1, 1, 1, 1}; // 0 ๋จผ์ ์จ์ผํจ! do { for (int i = 0; i < 9; i++) if (idx[i]) cout << num[i] << ' '; // {6, 7, 8, 9}์์ {1, 2, 3, 4}๊น์ง์ ๋ชจ๋ ์กฐํฉ์ `์ญ์`์ผ๋ก cout << '\n'; } while (next_permutation(idx.begin(), idx.end()));
- ๋ฒ์ ๊ธฐ๋ฐ for๋ฌธ์ ํ์ฉํ ์
์ถ๋ ฅ ์ฒ๋ฆฌ
vector<int> vec1(3); for (int& it : vec1) cin >> it; // ์ ๋ ฅ ์ฒ๋ฆฌ์๋ `&`๋ฅผ ๋ถ์ฌ์ผ ํจ (reference variable) for (int it : vec1) cout << it << '\n'; // for (auto it : vec1) cout << it << '\n'; vector<pair<int, int>> vec2(5); for (auto& [a, b] : vec2) cin >> a >> b; // (C++17) structured binding - ์์ auto ๋ถ์ฌ์ฃผ๊ธฐ!! for (const auto [a, b] : vec2) cout << a << ' ' << b << '\n'; // ์ถ๋ ฅ์ `&`๊ฐ ์์ด๋ ๋จ
<algorithm>
ํค๋ ์ ๊ณต ํจ์๋ค์์ initializer_list ํด๋์ค{}
ํ์ฉint val1 = 9999, val2 = 3210, val3 = -2147483648; cout << min({val1, val2, val3}) << ' ' << max({val1, val2, val3}); // cout << min(val1, min(val2, val3)) << ' ' << max(val1, max(val2, val3));
๋นํธ ์ฐ์ฐ์
๋ฅผ ํ์ฉํ ํจ์จ์ ์ธํ์
/ ์ง์ ํ๋ณint even = 2, odd = 3; if (odd&1) cout << "odd"; // ํ์์ &1ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ์ด 1, true (๋นํธํจํด์ ๋ง์ง๋ง ๋นํธ๋ง 1) if (!(even&1)) cout << "even"; // ์ง์์ &1 ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ์ด 0, false (๋นํธํจํด์ ๋ชจ๋ ๋นํธ๊ฐ 0) // ์ง์ ํ์ ์ ๋ฐ๋์ ๋ ๋ฒ ์ด์์ ์ฐ์ฐ์ด ํ์ํ์ง๋ง, ํ์ ํ์ ์ `&1`๋ก ํ ๋ฒ์ ์ฐ์ฐ์ ์ฒ๋ฆฌํ ์ ์๋ค
-
์ปจํ ์ด๋ ๊ณตํต:
- .size() ๋ฉ์๋๋ก ํ์ฌ ๋ด์๋๊ณ ์๋ ์์์ ์๋ฅผ ์ ์ ์์
- .empty() ๋ฉ์๋๋ก ํ์ฌ ์ปจํ ์ด๋๊ฐ ๋น์ด์๋์ง ์ ์ ์์
- ์ปจํ ์ด๋ ์์ฑ ์์ ์ ๊ฐ๋ค์ ๋ชจ๋ ์ ์ ์๋ค๋ฉด, initializer_list ์์ฑ์๋ฅผ ํ์ฉํ ์ ์์
-
๋ฌธ์์ด (
std::string
)string str; // cin >> str; // cin์ ํตํ ์ ๋ ฅ๋ ๊ฐ๋ฅ // cin.ignore() <<- ์ ๋ ฅ ์ฒ๋ฆฌ์ cin ๊ฐ์ฒด๋ฅผ ํ์ฉํ๋ค๋ฉด, getline() ํจ์ ์ฌ์ฉ ์ ์ cin.ignore() ํ์ getline(cin, str); // getline() ํจ์๋ฅผ ํตํด, ๊ณต๋ฐฑ์ ํฌํจํ ํ ์ค ์ ๋ ฅ์ string์ ๋ด์ ์ ์๋ค // std::getline() ํจ์๋ <string> ํค๋์ ์๋ค! // ์๋ฅด๊ธฐ ( Substring ) string sub = str.substr(start, count); // start ์ธ๋ฑ์ค๋ก๋ถํฐ count๊ฐ๋ฅผ ์ ํํ substring // str.substr(0, 3); <<- {0๋ฒ์งธ, 1๋ฒ์งธ, 2๋ฒ์งธ} ์ธ๋ฑ์ค, ์ฆ {์ฒซ๋ฒ์งธ, ๋๋ฒ์งธ, ์ธ๋ฒ์งธ} ๋ฌธ์๋ฅผ ๋ด์ return // ์ค๋ฅธ์ชฝ ๊ณต๋ฐฑ ์ ๊ฑฐ ( Right Trim ) str.erase(str.find_last_not_of(" \t\n\r\f\v") + 1); // str.erase(find_last_not_of("0x20 | 0x09 | 0x0a | 0x0d | 0x0c | 0x0b")+1); // find_last_not_of()๋ ๋ฌธ์์ด์ด ๋ชจ๋ ๊ณต๋ฐฑ์ผ ๊ฒฝ์ฐ string::npos๋ฅผ ๋ฐํํ๋ฏ๋ก +1์ ํด์ฃผ๋ฉด 0์ด ๋๋๋ฐ, // str.erase(0)์ str.erase(0, string::npos)์ ๊ฐ๊ณ , ๋ฌธ์์ด์ ๋ชจ๋ ์ง์ด๋ค // ์ผ์ชฝ ๊ณต๋ฐฑ ์ ๊ฑฐ ( Left Ttrim ) str.erase(0, str.find_first_not_of(" \t\n\r\f\v")); // find_first_not_of()๋ ๋ฌธ์์ด์ด ๋ชจ๋ ๊ณต๋ฐฑ(whitespace character)์ผ ๊ฒฝ์ฐ string::npos๋ฅผ ๋ฐํํ๋ฏ๋ก // str.erase(0, string::npos)๊ฐ ํธ์ถ๋์ด ๋ฌธ์์ด์ ๋ชจ๋ ์ง์ด๋ค
-
๋งต (
std::map
)map<T, U> mp; // map<T, U> mp{{key1, val1}, {key2, val2}}; // key-value ๋งคํ์ ์ฌ์ฉํจ. ๋ด๋ถ์ ์ผ๋ก pair<T, U>๋ฅผ ์ฌ์ฉํ๋ฉฐ key์ `operator<`๋ฅผ ์ ์ฉํด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํจ mp[key] = val; // ์กด์ฌํ์ง ์๋ key์ ์ ๊ทผํ๋ฉด U์ ๊ธฐ๋ณธ ์์ฑ์๊ฐ ํธ์ถ๋์ด {key, val} ์์ map์ insertํจ mp[key]++; // map<int, int>์ผ ๊ฒฝ์ฐ, {key, 0} -> `++` -> ์ต์ข ์ ์ผ๋ก {key, 1}๊ฐ map์ insert๋จ .find(key); // find ๋ฉ์๋๋ฅผ ํตํด ํน์ key์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ - ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ .end() ๋ฐํ // .contains() ๋ฉ์๋๊ฐ ๋ ์ง๊ด์ ์ด์ง๋ง, C++20 feature์ด๋ฏ๋ก find ๋ฉ์๋์ ์ต์ํด์ง๊ธฐ
-
ํด์๋งต (
std::unordered_map
)unordered_map<T, U> mp; // unordered_map<T, U> mp{{key1, val1}, {key2, val2}}; // map๊ณผ ๋น์ทํ์ง๋ง Hashing ๋ฐฉ์์ผ๋ก ๋์ํด ์์ ์ ๊ทผ์ ์๊ฐ๋ณต์ก๋๊ฐ O(1) // ๋จ, key๋ก ์ฌ์ฉํ ํ์ ์ ๋ฐ๋์ 1. hash function, 2. equality check ๋๊ฐ์ง๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํจ // primitive types, string ์ ๋๋ง key๋ก ์ฌ์ฉํ๋๊ฒ ์ข์ ๋ฏ (์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ฅผ key๋ก ์ฐ๋ ค๋ฉด ๊ท์ฐฎ๋ค)
-
์ (
std::set
)set<T> s; // set<T> s{val1, val2, val3}; // ํฌํจ ์ฌ๋ถ๋ฅผ ํ์ธํด์ผ ํ ๋ ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์์ผ๋ฉฐ, ์์๋ค์ uniqueness๋ฅผ ๋ณด์ฅ .insert(val); // insert ๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ ์ถ๊ฐํ๋ ค๊ณ `์๋`ํ ์ ์์ - ๊ฐ์ด ์ด๋ฏธ ์กด์ฌํ ๊ฒฝ์ฐ ๋ฌด์๋จ .find(val); // find ๋ฉ์๋๋ฅผ ํตํด ํน์ ๊ฐ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ - ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ .end() ๋ฐํ
-
๋ฆฌ์คํธ (
std::list
)list<T> li; // list<T> li{val1, val2, val3}; // [] ์ฐ์ฐ์๋ฅผ ์ง์ํ์ง ์์, ์์๋ฅผ ๋ค๋ฃฐ ๋ iterator๋ฅผ ์ฌ์ฉํด์ผ ํจ // .begin() ์ดํฐ๋ ์ดํฐ๋ฅผ ํ์ฉํ๋ ๋ฐฉ์์ด ๊ฐ์ฅ ์ง๊ด์ ์ auto it = li.begin(); cout << *it; // ์ฒซ๋ฒ์งธ ์์ ์ฐธ์กฐ for (int i = 0; i < N; i++) it++; // advance(it, N) ์ ๊ฐ๋ค cout << *it; // N+1๋ฒ์งธ ์์ ์ฐธ์กฐ (N์ด 2์ผ ๊ฒฝ์ฐ, 3๋ฒ์งธ ์์ ์ฐธ์กฐ) .insert(pos, val); // ์ด๋ pos๋ ์ดํฐ๋ ์ดํฐ. ์๋ก ๋ค์ด์จ ์์๊ฐ pos๋ฒ์งธ ์์๊ฐ ๋จ .erase(pos); // ์ญ์ ๋ ์์ ๋ค์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ์ดํฐ๋ ์ดํฐ๋ฅผ returnํจ. insert์ ํจ๊ป ์ฌ์ฉํ ์ ์์ li.insert(li.erase(it), val); // it์๋ฆฌ์ ์๋ ์๋ ์์๋ฅผ ์ญ์ ํ๊ณ , val๋ก ๋์ฒดํจ
-
๋ฒกํฐ, ๋์ ๋ฐฐ์ด (
std::vector
)vector<T> v; // vector<T> v{val1, val2, val3}; // ๋์ ๋ฐฐ์ด. ์์ฑ์๋ฅผ ํธ์ถ ์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ size์ capacity๋ ๋ชจ๋ 0 // push_back(), pop_back(), back() ์ธ๊ฐ์ง ์ฐ์ฐ์ผ๋ก ์คํ์ ๋์ฒดํ ์ ์์ (๊ธฐ๋ฅ์ด ๋ ๋ง์์ ํธ๋ฆฌํ๋ค) .push_back(val); // ํ์ฌ ์์๋ค์ ๋์ ์ถ๊ฐ. stack.push() ๋์ฒด ๊ฐ๋ฅ .pop_back(); // stack.pop() ๋์ฒด ๊ฐ๋ฅ .back(); // stack.top() ๋์ฒด ๊ฐ๋ฅ // .insert(pos, val) - insert ์ฐ์ฐ์ด ํ์ํ ๊ฒฝ์ฐ vector ๋์ list ์ฐ๊ธฐ vector<int> v(10); for (int& it : v) cin >> it; // for (auto& it : v) ๋ ๊ฐ๋ฅ
-
๋ฑ (
std::deque
)deque<T> dq; .push_front(val); .pop_front(); .push_back(); .pop_back(); // ๋ค์ง๋ ์ฐ์ฐ์ด ํ์ํ ๋, ์ค์ ๋ก ์์๋ฅผ ๋ค์ง๋ ๋์ ๋ฐ๋๋ก ์ํํ๋๋ก ํ ์ ์๋ค
-
ํ (
std::queue
)queue<T> q; .front(); .push(val); .pop();
-
์ฐ์ ์์ ํ (
std::priority_queue
)priority_queue<T> pq; .top(); // .front()๊ฐ ์๋๋ผ .top()์ด๋ค! top priority!! .push(); .pop();
- ์ค๋ฐ๊ฟ์ด ํ์ํ ๋
std::endl
๋์'\n'
์ฌ์ฉ cin.tie(nullptr)->ios_base::sync_with_stdio(false);
์ฒ๋ผ ์ฐ์ง ๋ง๊ณ ๋ถ๋ฆฌํ๊ธฐcin.tie(nullptr); cout.tie(nullptr); ios_base::sync_with_stdio(false);
for
,while
๊ฐ์ ์ ์ด๋ฌธ ํค์๋์ ์กฐ๊ฑด์๊ดํธ
์ฌ์ด๋ํ
์นธ
๋์์ฃผ๊ธฐfor(;;) // bad for (;;) // good!
if
,else if
,else
๊ตฌ๋ฌธ ์ ๋ ฌ -closing brace on new line, else on same line
if (cond1) { // } else if (cond2) { // good! // } else { // }