我正在迭代一个向量,需要迭代器当前指向的下标。下列方法的优缺点是什么?
It - vec.begin() std::距离(vec.begin ())
我正在迭代一个向量,需要迭代器当前指向的下标。下列方法的优缺点是什么?
It - vec.begin() std::距离(vec.begin ())
当前回答
根据http://www.cplusplus.com/reference/std/iterator/distance/,由于vecc .begin()是一个随机访问迭代器,distance方法使用-操作符。
因此,从性能的角度来看,答案是相同的,但是如果任何人都必须阅读和理解您的代码,那么使用distance()可能更容易理解。
其他回答
我刚刚发现了这个:https://greek0.net/boost-range/boost-adaptors-indexed.html
for (const auto & element : str | boost::adaptors::indexed(0)) {
std::cout << element.index()
<< " : "
<< element.value()
<< std::endl;
}
除了int float string等,当使用div . types时,你可以将额外的数据放入.second,例如:
std::map<unsigned long long int, glm::ivec2> voxels_corners;
std::map<unsigned long long int, glm::ivec2>::iterator it_corners;
or
struct voxel_map {
int x,i;
};
std::map<unsigned long long int, voxel_map> voxels_corners;
std::map<unsigned long long int, voxel_map>::iterator it_corners;
when
long long unsigned int index_first=some_key; // llu in this case...
int i=0;
voxels_corners.insert(std::make_pair(index_first,glm::ivec2(1,i++)));
or
long long unsigned int index_first=some_key;
int index_counter=0;
voxel_map one;
one.x=1;
one.i=index_counter++;
voxels_corners.insert(std::make_pair(index_first,one));
使用正确的||结构,你可以把任何东西放在。second中,包括在进行插入时递增的索引号。
而不是
it_corners - _corners.begin()
or
std::distance(it_corners.begin(), it_corners)
后
it_corners = voxels_corners.find(index_first+bdif_x+x_z);
索引很简单:
int vertice_index = it_corners->second.y;
当使用glm::ivec2类型时
or
int vertice_index = it_corners->second.i;
对于结构数据类型
正如本叔叔和内文所表明的那样,两者都有很好的理由。哪一种“更好”取决于您想要的行为:您是希望保证常量时间行为,还是希望在必要时回落到线性时间?
它- vvector .begin()花费常数时间,但operator -仅在随机访问迭代器上定义,因此,例如,对于列表迭代器,代码根本无法编译。
Std::distance(vecc .begin(), it)适用于所有类型的迭代器,但如果用于随机访问迭代器,则只会是一个常量时间操作。
两者都不是“更好”。用你需要的那个。
我更喜欢它- vvector .begin(),正是因为Naveen给出的相反原因:所以如果你将vector更改为列表,它就不会编译。如果你在每次迭代中都这样做,你可以很容易地把O(n)算法变成O(n²)算法。
另一种选择是,如果在迭代期间不在容器中跳来跳去,则将索引保留为第二个循环计数器。
注意:它是容器迭代器的常用名称,std::container_type::iterator it;。
根据http://www.cplusplus.com/reference/std/iterator/distance/,由于vecc .begin()是一个随机访问迭代器,distance方法使用-操作符。
因此,从性能的角度来看,答案是相同的,但是如果任何人都必须阅读和理解您的代码,那么使用distance()可能更容易理解。