map迭代器用法介绍

2023-12-15 14:18:26网络知识悟空

一、map迭代器使用

map是C++中常用的一个关联数组容器,其通过key-value的形式实现数据存储和访问。而迭代器则是容器的重要组成部分,其可以对容器中的元素进行访问和操作。

在map中,迭代器通常用于遍历map中的元素,可以先通过begin()函数获取map的首元素,再通过对迭代器的自增操作实现遍历。下面是map迭代器使用的示例代码:

#include 
#include 

int main() {
    std::map myMap = {
        {"apple", 1},
        {"banana", 2},
        {"cherry", 3},
    };
    for (auto iterator = myMap.begin(); iterator != myMap.end(); iterator++) {
        std::cout << iterator->first << " : " << iterator->second << std::endl;
    }
    return 0;
}

上述代码中,使用了auto关键字定义迭代器变量iterator,通过myMap.begin()获取第一个元素的迭代器,通过myMap.end()获取最后一个元素的迭代器,并使用for循环对map进行遍历,输出每个元素的key和value。

二、map迭代器转结构体指针

有时候我们需要将map中的数据从容器的形式转换成结构体指针的形式,这时候我们可以利用迭代器来实现。下面的代码示例将map中的数据转换成结构体指针:

#include 
#include 

struct Fruit {
    std::string name;
    int price;
};

int main() {
    std::map myMap = {
        {"apple", 1},
        {"banana", 2},
        {"cherry", 3},
    };
    Fruit* fruitPtr = nullptr;
    for (auto iterator = myMap.begin(); iterator != myMap.end(); iterator++) {
        Fruit fruit = {
            iterator->first,
            iterator->second
        };
        fruitPtr = &fruit;
        std::cout << fruitPtr->name << " : " << fruitPtr->price << std::endl;
    }
    return 0;
}

上述代码中,首先定义了一个Fruit结构体用于存放水果的名称和价格。在for循环中,定义了一个fruit变量,并通过迭代器获取到当前遍历到的元素的key和value值,赋值给fruit结构体,再通过结构体指针输出对应的数据。

三、map迭代器是什么

map迭代器其实是一种类似于指针的实体,其可以指向map容器中的某个元素。map迭代器可以实现对map容器中的元素进行迭代访问,主要用于实现遍历、查找和删除操作。

四、map迭代器类型

C++中的STL提供了多种类型的迭代器,map中使用的迭代器主要有const_iterator、iterator、reverse_iterator和const_reverse_iterator四种类型。

其中const_iterator和const_reverse_iterator类型的迭代器可以用于访问map容器中的const数据,而iterator和reverse_iterator类型的迭代器则用于访问可修改的map容器中的元素。

五、map迭代器用法

在使用map迭代器时,可以使用.begin()和.end()函数获取map容器的第一个元素和最后一个元素的迭代器,也可以使用.find()函数根据key值来查找对应元素的迭代器。

在遍历map容器时,可以直接使用迭代器指向元素,也可以使用->运算符获取当前迭代器所指向的元素的key、value值。

六、map迭代器删除

使用迭代器进行map容器中元素的删除时,需注意一些问题。当从map中删除元素时,会使得当前迭代器失效,因为其指向的元素已经被删除,所以需要在删除元素前先保存好下一个元素的迭代器,再进行删除操作。

下面的示例代码演示了使用迭代器进行map容器中元素的删除:

#include 
#include 

int main() {
    std::map myMap = {
        {"apple", 1},
        {"banana", 2},
        {"cherry", 3},
    };
    auto iterator = myMap.begin();
    myMap.erase(iterator);
    iterator = myMap.begin();
    std::cout << iterator->first << " : " << iterator->second << std::endl;
    return 0;
}

上述代码中,首先获取了myMap中第一个元素的迭代器,然后通过myMap.erase()函数删除该元素,之后需要重新获取迭代器,才能访问新的第一个元素。

七、map迭代器失效

使用map迭代器进行操作时,还需注意当前迭代器是否会因为某些操作而失效。常见的情况有插入、删除元素和改变元素key值等,这些操作会使得迭代器失效。当失效时,会产生运行时错误,因此在进行这些操作时,需要注意迭代器的使用。

八、map迭代器实现

map迭代器的实现原理其实就是重载了C++中的*运算符和->运算符。当使用迭代器指向map中的某一个元素时,可以直接通过*iterator来获取该元素的value值,也可以通过iterator->first和iterator->second来获取该元素的key和value值。

九、map迭代器转为列表

除了使用迭代器遍历map元素外,有时我们也需要将map转换为列表的形式,这时候可以利用迭代器和STL中的std::list容器来实现。下面的代码示例展示了将map转为列表的操作:

#include 
#include 
#include 

struct Fruit {
    std::string name;
    int price;
};

int main() {
    std::map myMap = {
        {"apple", 1},
        {"banana", 2},
        {"cherry", 3},
    };
    std::list myFruitList;
    for (auto iterator = myMap.begin(); iterator != myMap.end(); iterator++) {
        Fruit fruit = {
            iterator->first,
            iterator->second
        };
        myFruitList.push_back(fruit);
    }
    for (auto it : myFruitList) {
        std::cout << it.name << " : " << it.price << std::endl;
    }
    return 0;
}

上述代码中,定义了一个Fruit结构体用于存放水果的名称和价格。在for循环中,同样是先通过迭代器获取到当前遍历到的元素的key和value值,赋值给fruit结构体,再将fruit结构体插入到list容器中。最后再通过for循环遍历整个list容器,输出每个元素的key和value。

十、map迭代器中删除选取

map迭代器中的删除选取操作即遍历元素进行判断后进行删除操作,下面的代码示例演示了如何实现删除名字中有字母'a'的元素:

#include
#include

int main() {
    std::map myMap = {
        {"apple", 1},
        {"banana", 2},
        {"cherry", 3},
    };
    std::map::iterator it;
    for (it = myMap.begin(); it != myMap.end();) {
        if ((it->first).find('a') != std::string::npos) {
            myMap.erase(it++);
        } else {
            ++it;
        }
    }
    for (it = myMap.begin(); it != myMap.end(); ++it) {
        std::cout << it->first << " : " << it->second << "\n";
    }
    return 0;
}

上述代码中,使用for循环遍历元素,当元素的名字中包含字母'a'时,通过迭代器对其进行删除操作。需要注意的是,删除元素后需要重新获取迭代器指向下一个元素,否则会导致后续程序的异常。

发表评论: