首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >这个std::set初始化是如何工作的?

这个std::set初始化是如何工作的?
EN

Stack Overflow用户
提问于 2018-06-03 02:42:54
回答 1查看 120关注 0票数 -2

我在理解std::set初始化如何工作时遇到了一些问题。我在一个函数中有以下代码:

代码语言:javascript
复制
std::map<int, int> my_map  = {
    {16, 24},
    {19, 29},
    {15, 23},
    {14, 22},
    {13, 21},   
    {17, 28},
};

typedef std::function<bool(std::pair<int, int>, std::pair<int, int>)> comparefunction;


comparefunction compare = 
    [](std::pair<int, int> a, std::pair<int, int> b){
        if(lessthan(a,b))
            std::cout << "a" << std::endl;
        else
            std::cout << "b" << std::endl;


        return true;
    };

std::set<std::pair<int, int>, comparefunction>
    values(my_map.begin(), my_map.end(), compare);

当调用这个函数时,它会打印"b“几次,为什么呢?

编辑:我意识到我使用了range构造函数,但是它如何使用map中的元素“自动”调用lambda函数呢?我似乎在文档中找不到这一点。打印a和b的内容显示它们总是相同的,这是为什么?

EN

回答 1

Stack Overflow用户

发布于 2018-06-03 03:11:51

我认为令您困惑的是map迭代器的行为。遍历映射(从my_map.begin()my_map.end())意味着遍历对,其类型为std::pair<K, V> (对于键类型K和映射值类型V);在本例中为std::pair<int, int>。因此,实际上,映射非常类似于这些对的集合。

现在,您正在使用的集合的构造函数(如@AlgirdasPreid suggest和@žthe suggest)是集合的constructor which inserts all of the elements in some range (=从开始迭代器到结束迭代器)。所以你得到了一组对。

最后,lambda用于可能更改元素相同的规则。

现在说得通了吗?

PS 1:您可能更喜欢unordered_setunordered_map;不过,还是尝试一下,看看哪种更适合您的需求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50660058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档