我在理解std::set初始化如何工作时遇到了一些问题。我在一个函数中有以下代码:
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的内容显示它们总是相同的,这是为什么?
发布于 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_set
和unordered_map
;不过,还是尝试一下,看看哪种更适合您的需求。
https://stackoverflow.com/questions/50660058
复制相似问题