【发布时间】:2012-06-16 13:08:48
【问题描述】:
一个明显的(天真的?)方法是:
std::set<int> s;
for (int i = 0; i < SIZE; ++i) {
s.insert(i);
}
这是合理的可读性,但据我了解,这不是最佳的,因为它涉及重复搜索插入位置并且没有利用输入序列已经排序的事实。
是否有一种更优雅/更有效(或事实上)的方式来初始化带有数字序列的std::set?
或者,更一般地说,如何有效地将有序的条目列表插入到集合中?
更新:
查看文档,我刚刚注意到接受迭代器以指示插入位置的构造函数:
iterator insert ( iterator position, const value_type& x );
这意味着这样会更有效率:
std::set<int> s;
std::set<int>::iterator it = s.begin();
for (int i = 0; i < SIZE; ++i) {
it = s.insert(it, i);
}
这看起来很合理,但我仍然愿意接受更多建议。
【问题讨论】:
-
嗯,如果您真的想找到最有效的方法,您应该对此进行基准测试。由于输入是升序的,我觉得你在错误的位置添加元素(集合保持升序,所以 begin() 会指向最低的数字)。你能对它进行基准测试吗?我真的很感兴趣:D
-
@mfontanini 我正在初始化一个空集,所以
begin()应该可以完成这项工作。我会看看能不能做一个快速的基准测试,但我很确定第二个版本会更快。 -
你是对的。感谢您的测试。
标签: c++ stl initialization stdset