如何获得对容器中某个对象的迭代器?

时间:2018-06-20 15:46:33

标签: c++ visual-studio stl iterator find

我目前正在尝试复制std::vector的一部分,从第一个值开始,直到“遇到”一系列值为止。我主要使用STL算法,尤其是std::find_if()(我知道还有其他方法可以实现第一句话中所述的目标,但是我主要是为了理解STL而这样做,因此使用它们将使根本目的)。

作为示例,假设要复制一个vector包含整数元素(代码中的originalvec),直到首先遇到6,然后直接相继遇到7。我知道如何比较6,然后我想在同一个lambda调用中进行比较,如果在6后面有7。我想(不确定)为此,我需要为6,然后在迭代器上使用std::advance()或仅使用operator++并将比较的值与7进行比较。但是,我不知道如何将迭代器的值设为6 /当前比较的数字?

#include <algorithm>
#include <vector>

using namespace std;

int main() {
    vector <int> originalvec = { 4, 8, 7, 6, 55, 2, 6, 7, 8 };
    vector <int> newvec;

    copy(originalvec.begin(),
        find_if(originalvec.begin(), originalvec.end(), [](int curnum) {
            return (curnum == 6);
        }),
        back_inserter(newvec));
    //why does newvec.begin() (instead of back_inserter(newvec)) not work?

    //current result:   newvec = {4, 8, 7}
    //wanted result :   newvec = {4, 8, 7, 6, 55, 2}

    /*wanted function is roughly in this style:
    copy(originalvec.begin(),
        find_if(originalvec.begin(), originalvec.end(), [](int curnum) {
            return (curnum == 6 && [curnum* +1] == 7);
        }),
        back_inserter(newvec)); 
    */

    return 0;
}

2 个答案:

答案 0 :(得分:6)

在这种情况下,您可以使用std::adjacent_find

auto it = std::adjacent_find( originalvec.begin(), originalvec.end(), []( int i1, int i2 )   {
    return i1 == 6 and i2 == 7;
} );

Live example

答案 1 :(得分:0)

例如,您可以使用自定义查找功能(未经测试)

template <typename It, typename T>
It find_succ(It begin, It end, T v1, T v2)
{
    if (begin == end)
        return end;
    It next = begin;
    ++next;
    while (next != end) {
        if (*begin == v1 && *next == v2)
            return begin;
        ++begin, ++next;
    }
    return end;
}