如何从指向矢量迭代器的指针中找到索引

时间:2016-08-12 05:26:18

标签: c++ vector

我有一个指向矢量迭代器的指针;我不知道矢量是什么。因此it - vec.begin()std::distance(vec.begin(), it)无用,因为我不知道向量vec是什么。我开始知道it - vec.begin()是一个恒定时间算法。所以我认为索引的数值肯定存储在向量迭代器中作为一些私有成员。如何在不知道迭代器中的向量的情况下找到索引?

2 个答案:

答案 0 :(得分:1)

看到这个问题: Converting a vector to an array - Is there a 'standard' way to do this?

标准要求向量按顺序存储它们的元素(除了bool向量)。这意味着迭代器不需要在向量中存储数据的索引,只是指向向量中指定元素的指针。您可以使用it - vec.begin()获取索引的原因是您要比较其地址保证连续的元素向量的两个不同地址。 " vec.begin()"只是一个参考点。

这就是为什么你基本上可以获得"数组"在向量中使用&theVector[0],因为每当保证多个变量具有连续的地址分配时,这与数组完全相同。

答案 1 :(得分:0)

只回过最后一个问题“如何在不知道迭代器中的向量的情况下找到索引?”。这是由Visual Studio 2015编译的,所以要小心。

    std::vector<int> ints;
    ints.push_back(0);
    ints.push_back(1);
    ints.push_back(2);

    std::vector<int>::iterator it = ints.begin();
    ++it;
    ++it; // now it points to ints[2]

    int result_index = 0; // should output 2 later
    while (true)
    {
        std::vector<int>* cont = (std::vector<int>*)(it._Getcont());
        int* head = (cont->_Myfirst());
        int* current = it._Ptr;
        int index = current - head;
        if (index == 0)
        {
            break;
        }
        else
        {
            ++result_index;
            --it;
            continue;
        }
    }
    std::cout << result_index << std::endl; // output 2