迭代器指向哪个索引

时间:2012-04-27 10:38:41

标签: c++ iterator

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

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

5 个答案:

答案 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()中减去它,但如果索引如此重要,我想知道你是不是只使用它而不是迭代器 - 当然它取决于您是否有权访问代码来重构它。

我不确定你要用你的开关实现什么,但是如果要映射值,那么大概是稀疏矢量会更合适吗?