我有一套,让我们说set<string>tmpSet
。我有一些元素,例如10
,但我不知道它们是什么,因为我已经通过另外两组set_intersection
设置了这个元素。我可以在集合中显示例如first, third and eighth
元素吗?
答案 0 :(得分:1)
是
std::set<std::string> tmpSet = ...; // Create your set somehow.
// Get an iterator to the first (smallest) item in the set.
std::set<std::string>::iterator setStartIt = tmpSet.begin();
// Dereference the iterator to obtain a reference to the first element.
std::string& firstItem = *setStart;
// Get an iterator for the third element (this is two after the first!).
auto thirdItemIt = std::next(setStartIt, 2);
std::string& thirdItem = *thirdItemIt;
// Get the tenth item.
std::string& tenthItem = *std::next(setStartIt, 9);
请注意,您还可以使用std::advance()
(它会修改您传递的迭代器,而不是返回新的迭代器。
另请注意,这样做效率不高:由于std::set
迭代器不是RandomAccessIterator
,std::next
和std::advance
的复杂度是线性的(因此需要10次操作)获得第10项)。
如果你想看看所有元素,那么循环它们当然是正确的方法:
for (auto it = tmpSet.begin(); it != tempSet.end(); ++it) {
std::string currentElement = *it;
...
}
或者,使用基于范围的for循环:
for (auto& currentElement : tmpSet)
...
答案 1 :(得分:0)
std::set
中的元素始终按顺序(集合通常实现为red-black tree
)。当然,可以使用这个有趣的属性。
使用range-based for
(自Cpp11起)或搜索set::begin()
和set::end()
之间的部分,您可以确保内部元素。
答案 2 :(得分:0)
可以找到std :: set的描述here。关键点是
create table customer(custId int(25) primary key not null auto_increment,) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1001;
一样选择随机元素。这意味着O(n)随机元素的访问时间。如果您确实想要随机访问,可以使用boost::flat_set。除
外,它具有与上述相同的属性tmpSet[8]
。