2

向量有一个迭代器。我想知道迭代器指向哪个索引。所以我做了以下但我不确定。

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;
    }
}
4

5 回答 5

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 所指出的。

于 2012-04-27T10:40:47.970 回答
2

为什么不这样:

std::vector <int> ::iterator f;

int index = 0;

for (f=eFace[e].begin(); f!=eFace[e].end(); ++f)
{
     // do sth

     index++;
}
于 2012-04-27T10:42:01.027 回答
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];
}
于 2012-04-27T11:21:08.273 回答
0

对于您的问题“我想知道迭代器指向哪个索引。” 通过说std::vector<int>::iterator f = eFace.begin();您正在创建一个类似于索引方法的交互器std::vector<int>::size_type i = 0;

使用迭代器,您使用eFace.begin()!= eFace.end()方式i = 0与使用循环!= eFace.size()遍历向量时使用的方式相同。for

至少我认为这就是您最初的问题。

于 2012-04-27T11:18:37.810 回答
0

我想知道当你有迭代器时为什么需要数组的索引?如果迭代器是随机访问的,你可以从中减去它begin(),但如果索引如此重要,我想知道你是否最好只使用它而不是迭代器 - 当然这取决于你是否有权访问代码来重构它.

我不太确定你想用你的开关实现什么,但如果它是映射值,那么大概一个稀疏向量会更合适?

于 2012-04-27T11:30:28.120 回答