从向量和unordered_sets中检索数据

时间:2015-01-20 21:15:33

标签: c++ vector unordered-set

我已经开始将数据放入vectorunordered_set。我已经很容易地解决了如何将数据放入其中,并且我知道如果需要卸载所有数据,如何获取数据,例如:

for (auto i : vehicles)
    MakeSpawnInfoVehicle(i.AddedInformation);

但是,我已经达到了这样的程度:我只需要来自unordered_setvector的一个信息元素,例如vector中的第10个条目或unordered_set

如果有人可以提供两者的基本示例,我相信我会理解它。

1 个答案:

答案 0 :(得分:5)

在这种情况下,您可以咨询good reference

std::vectoroperator[]提供了恒定时间效果:

auto tenth_element = vehicle_vector[9];

std::unordered_set针对基于元素的查找进行了优化(即,测试元素是否存在)。您很少需要第10个元素(特别是因为该集合定义为无序),但如果您这样做,则使用迭代器,递增它并取消引用它:

auto tenth_element = *std::next(vehicle_set.begin(), 9);

通常,您可以通过容器的成员函数(例如上面的向量operator [])或通过迭代器来访问容器的元素。

迭代器是指针的泛化 - 它是一些未指定的类型,它指向容器中的元素。然后,您可以使用其operator ++等成员函数或std::next()等自由函数来使用迭代器。随机访问迭代器也支持[]。要获取迭代器“指向”的元素,请取消引用像*itit->whatever这样的迭代器。

使用begin()获取到容器开头的迭代器,使用end()获取一个超过最后一个元素的迭代器。容器还可以提供其他成员函数来获取元素的迭代器 - 例如vehicle_set.find(aVehicle),如果它存在于集合中则返回aVehicle的迭代器,如果它是end()迭代器则返回std::vector迭代器。不

容器提供的成员函数取决于它是哪个容器,特别是操作的效率。 find()未提供std::find(),因为它不会比std::vector更好 - std::unordered_set中没有用于快速查找的结构。 find()确实提供operator [],但没有{{1}},因为它的迭代器不是随机访问:访问无序集的 n 元素需要时间与 n。

成正比