向量有一个迭代器。我想知道迭代器指向哪个索引。所以我做了以下但我不确定。
int temp = -1;
std::vector <int> ::iterator f;
for (f=eFace[e].begin(); f!=eFace[e].end(); ++f)
{
if (*f == face)
{
switch (f-eFace[e].begin())
{
case 0:
temp = 5;
break;
case 1:
temp = 3;
break;
case 2:
temp = 4;
break;
case 3:
temp = 1;
break;
case 4:
temp = 2;
break;
case 5:
temp = 0;
break;
default:
throw;
}
break;
}
}
答案 0 :(得分:4)
std::vector<int>::size_type index = std::distance (eFace [e].begin(), f);
请注意,如果您在每个循环执行它,这可能会很慢。向量的另一个选择是:
std::vector<int>::size_type index = f - eFace [e].begin();
这是有效的,因为向量使用随机访问迭代器,这需要定义减法,如下面Steve Jessop所指出的那样。
答案 1 :(得分:2)
为什么不这样:
std::vector <int> ::iterator f;
int index = 0;
for (f=eFace[e].begin(); f!=eFace[e].end(); ++f)
{
// do sth
index++;
}
答案 2 :(得分:2)
获得更清晰的代码会更容易。
首先,在向量中找到一个值:
// Returns the index of `face` in `vec`.
// If `face` is not present in `vec`, returns `vec.size()`.
size_t findFaceIndex(int const face, std::vector<int> const& vec) {
std::vector<int>::const_iterator const it =
std::find(vec.begin(), vec.end(), face);
return it - vec.begin();
}
现在映射:
static int const FaceMap[] = { 5, 3, 4, 1, 2, 0 };
static size_t const FaceMapSize = sizeof(FaceMap)/sizeof(int);
// Translate face index into ...
int faceIndexToX(size_t const index) {
if (index >= FaceMapSize) { throw std::runtime_error("out of bounds"); }
return FaceMap[index];
}
答案 3 :(得分:0)
对于您的问题“我想知道迭代器指向哪个索引。”通过说std::vector<int>::iterator f = eFace.begin();
,您正在创建一个类似于索引方法的交互器,通过说std::vector<int>::size_type i = 0;
。
使用迭代器时,使用eFace.begin()
和!= eFace.end()
的方式与使用i = 0
和!= eFace.size()
时使用for
循环的向量相同。< / p>
至少我认为这就是你原来的问题。
答案 4 :(得分:0)
我想知道为什么在拥有迭代器时需要数组的索引?如果迭代器是随机访问,你可以从begin()
中减去它,但如果索引如此重要,我想知道你是不是只使用它而不是迭代器 - 当然它取决于您是否有权访问代码来重构它。
我不确定你要用你的开关实现什么,但是如果要映射值,那么大概是稀疏矢量会更合适吗?