通过索引获取C ++ std :: set的成员

时间:2011-07-12 20:14:20

标签: c++ stl

有没有办法使用其中一个stl算法定义来获取集合中成员的成员?

我可以使用类似下面的实用方法,但我必须认为这已经存在于stl中的某种通用形式:

ElementPtr elementAt(int elementNumber)
{
    list<ElementPtr>::iterator elementIt = elements.begin();
    for (int counter = 0; counter < elementNumber && elementIt != elements.end(); counter++, elementIt++) 
    {
    }

    return *elementIt;
}

8 个答案:

答案 0 :(得分:3)

#include <iterator>

list<ElementPtr>::iterator elementIt = elements.begin();
std::advance(elementIt, elementNumber);
x = *elementIt;

这基本上与您的代码有关。

但是,您最想要这样做的事实表明您的数据结构是错误的。集合不是设计为像这样处理。

答案 1 :(得分:2)

如果它实现为二叉树或哈希表,则没有可用的索引机制,这两种方法对于集合都是通用的。

答案 2 :(得分:2)

您实际使用的是正确的容器类型吗?请考虑使用排序向量。

答案 3 :(得分:2)

您可以使用Boost.MultiIndex在同一基础数据上构建排序和随机访问索引。

答案 4 :(得分:1)

我不相信,因为“index-of”在广义std::set方面并没有真正意义。除非您的集合被构造(并初始化)一次并且从未改变过,否则您无法保证对index-of运算符的调用结果总是会返回可预测的结果。

答案 5 :(得分:1)

你将获得的最好的是迭代器。集合是值 索引的容器(嗯,更多是散列表中的引用)。如果我们知道你想要做什么,也许我们可以更好地回答你的问题。

我认为你将一个集合等同于一个数组;它们的结构完全不同,数字索引不适用。

答案 6 :(得分:0)

你说设置,但你的代码实际上表示列表。两者不一样。集合旨在通过其值检索其元素。列表,您可以使用std::advance向前推进。

答案 7 :(得分:0)

集合中没有数字索引这样的东西。你需要使用矢量。更重要的是,如果您确实碰巧在集合中“获得第n个项目”,则无法保证在修改集合之后它(在同一个地方)。