如何从集合C ++中显示某个项目

时间:2018-04-04 13:24:34

标签: c++ set

我有一套,让我们说set<string>tmpSet。我有一些元素,例如10,但我不知道它们是什么,因为我已经通过另外两组set_intersection设置了这个元素。我可以在集合中显示例如first, third and eighth元素吗?

3 个答案:

答案 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迭代器不是RandomAccessIteratorstd::nextstd::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()之间的部分,您可以确保内部元素。

以下是参考http://en.cppreference.com/w/cpp/container/set

答案 2 :(得分:0)

可以找到std :: set的描述here。关键点是

  1. 元素已排序
  2. 元素是唯一的
  3. 查找时间为O(lg2(n))
  4. 插入时间也是O(lg2(n))
  5. 元素访问双向。您可以向前和向后迭代,但不能像create table customer(custId int(25) primary key not null auto_increment,) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1001; 一样选择随机元素。这意味着O(n)随机元素的访问时间。
  6. 如果您确实想要随机访问,可以使用boost::flat_set。除

    外,它具有与上述相同的属性
    1. 插入时间为O(n)
    2. 元素访问是随机的,因此您可以编写具有O(1)复杂度的tmpSet[8]