在c++中使用键值对

起因

因为最近没上班,边看起LeetCode算法,便尝试用C++做一些简单的算法题.一直没接触到C++的键值对集合. 在C++键值对集合分为顺序和无序的.
在C++中的键值对集合.分为顺序和无序的,有set和map

set

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

    //使用set 需要引入set头文件
    set<int> set1;  //方式1 定义并初始化一个set

    set<int> set2{1, 2, 3};  //方式而 初始有值的set集合

    int arr[] = {3, 2, 4};
    set<int> set3(arr, arr + sizeof(arr) / sizeof(int));

    //在set添加元素
    set3.insert(1);

    //遍历set
    for (set<int>::iterator iter = set3.begin(); iter != set3.end(); iter++) {
        cout << *iter << " ";
    }
    cout << endl;

    //简历遍历元素的方式
    for (auto  item : set3) {
        cout << item << " ";
    }
    cout << endl;

    //移除元素
    set3.erase(1);

    cin.get();
    return 0;
}

在调试的时候,发现在set初始化之后,值已经变为顺序的

map

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

    //使用map需要引入map头文件
    map<int, int> map1;

    vector<int> vec1{3, 2, 4};
    for (int i = 0; i < vec1.size(); ++i) {
        map1[vec1[i]] = 0; //根据key 修改值
    }

    //通过insert插入key和value, 通过insert会判断key是否存在,如果存在会报错
    map1.insert(pair<int, int>(6, 0));
    map1.insert(make_pair<int, int>(10, 0));

    //根据迭代器遍历元素key 和 value
    for (map<int, int>::iterator iter = map1.begin(); iter != map1.end(); iter++) {
        cout << "key: " << iter->first << " value:" << iter->second << endl;
    }

    //简化遍历元素的方式
    for (auto item : map1) {
        cout << "key: " << item.first << " value:" << item.second << endl;
    }


    //删除元素
    map1.erase(6); //删除key为6的元素

    cin.get();
    return 0;
}
查看map,在内存中存储是按顺序存储的
在删除元素中,再次查看元素的顺序.
查看map,在删除元素为6的之后的,元素存储顺序

unordered_set

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

    vector<int> vec1{3, 2, 4};

    //使用unordered_set需要引入unordered_set头文件
    unordered_set<int> set1;

    unordered_set<int> set2{3,2,1,10,6,5,4};

    unordered_set<int> set3;
    for (int i = 0; i < vec1.size(); ++i) {
        set3.insert(vec1[i]); //循环插入元素
    }



    //根据迭代器遍历元素key 和 value
    for (unordered_set<int>::iterator iter = set3.begin();iter!=set3.end();iter++) {
        cout << *iter << " ";
    }
    cout<<endl;

    //简化遍历元素的方式
    for (auto item : set3) {
        cout << item << " ";
    }
    cout<<endl;

    //删除元素
    set3.erase(6); //删除key为6的元素

    cin.get();
    return 0;
}

unorder_set和set区别是无序存储的

unordered_map

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

    vector<int> vec1{3, 2, 4};

    //使用unordered_map需要引入unordered_map头文件
    unordered_map<int, int> map1;

    unordered_map<int, int> map2;

    for (int i = 0; i < vec1.size(); ++i) {
        map1.insert(pair<int, int>(vec1[i], 0));
    }

    //根据迭代器遍历元素key 和 value
    for (unordered_map<int, int>::iterator iter = map1.begin(); iter != map1.end(); iter++) {
        cout << "key:" << iter->first << " value:" << iter->second << " ";
    }
    cout << endl;

    //简化遍历元素的方式
    for (auto item : map1) {
        cout << "key:" << item.first << " value:" << item.second << " ";
    }
    cout << endl;

    //删除元素
    map1.erase(2); //删除key为6的元素

    cin.get();
    return 0;
}

unorder_map在内部存储也是无序的,通过hash值进行存储的

总结

在C++的容器中添加元素和删除元素分别是insert和erase,一直以来都没在c++上花过精力去学习,在使用了容器,发现C++是可以很现代的.尤其是在使用C++ 新版本(c++11 c++17),使用一些新的语法简化是可以很大程度上提高工作效率的.
秋风 2020-12-21