본문 바로가기
패스트캠퍼스 챌린지(C++ 올인원)

패스트캠퍼스 챌린지 24일차

by 승욱은 2021. 11. 24.

지난밤에 배가 너무 고픈 나머지.. 라면을 부숴먹어 버렸다.. 그 이후 잠에 들지를 못했는데.. 역시나 컨디션 난조다.. ㅠ 제때제때 밥 잘 먹고, 따뜻하게만 하면 될 텐데.. 내 생활 습관 때문인가 보다 ㅠ 오늘은 제 때 맛있는 거 먹고 잘 자야겠다.. ㅠ

 

오늘은 별거 없이 간단하게 lazy segtree 문제 하나 풀고, 유튜브 영상 촬영하고, 그 이후로는 강의를 들었다. 배운 내용은 첨자 연산자 오버로딩과 대입 연산자 오버 로딩 및 복사 생성자였다. 

 

일단 오늘 배운 내용..! 가히 혁신적인 내용이었다..! 아니... 아니..! [ ]를 오버로딩할 수 있다는 게 말이나 되는가..! 이렇게 하면 LinkedList를 구현했을 때 [ ]로 원소 순서에 접근하는 것이 가능해진다..! 오오.. 그리고 수업 시간에 해쉬 테이블을 만들어봤는데...! 이건 뭐 거의 파이썬 dict()랑 별로 다를 게 없다. 물론 내부 구현을 좀 더 완벽하게 해야 하겠지만..! 이 정도만이라도 상당히 좋지 않을까 싶다.

#include <iostream>
#include <cstring>
#include <vector>

using namespace std;
using Key = string;
using Value = string;
using KeyValue = pair<string, string>;

class Bucket
{
private:
    vector<KeyValue> _items;

public:
    Value &get(const Key &key)
    {
        for (KeyValue &keyValue : _items)
        {
            if (keyValue.first == key)
            {
                return keyValue.second;
            }
        }
        _items.push_back(std::make_pair(key, Value()));
        return _items.back().second;
    }
};

class HashTable
{
private:
    vector<Bucket> _buckets;

    int hash(const Key &key) const
    {
        int h = 0;
        for (char ch : key)
        {
            h += ch;
        }
        return h;
    }

public:
    HashTable(int size = 100) : _buckets(vector<Bucket>(size)){};

    Value &operator[](Key key)
    {
        int bucketIndex = hash(key) % _buckets.size();
        Bucket &bucket = _buckets[bucketIndex];
        return bucket.get(key);
    }
};

int main()
{
    HashTable hash;
    hash["abc"] = "def";

    cout << hash["abc"] << endl;

    hash["abc"] = "123";
    cout << hash["abc"] << endl;

    hash["cba"] = "456";
    cout << hash["abc"] << endl;
    cout << hash["cba"] << endl; 
} // namespace std;

나름 해쉬 충돌도 구현이 되었다..! 오버로딩을 배우기 전까지는 c++은 딱딱한 언어라고만 생각했는데..! 상당히 말랑말랑한 느낌이 든다..!

 

그리고 대입 연산자에 대해 배우면서 얕은 복사, 깊은 복사를 다루었다. 그냥 대입 연산자로만 이루어지는 경우에는 얕은 복사가 일어나, 내부 포인터가 참조하는 값까지 복사가 되지는 않는다. 따라서 대입 연산자, 그리고 복사 생성자를 만들어서 이런 경우를 대비해야 한다..! 물론 파이썬처럼 deepcopy 함수가 있어 그것만 해주면 되면 좋겠지만..! 그래도 좋은 것을 배웠다..!

 

얕은 복사, 깊은 복사를 배우는 모습

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

패스트캠퍼스 : https://bit.ly/3FVdhDa

 

수강료 100% 환급 챌린지 | 패스트캠퍼스

딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!

fastcampus.co.kr

 

#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #C++실력완성올인원패키지

댓글