我目前正在尝试复制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;
}
答案 0 :(得分:6)
在这种情况下,您可以使用std::adjacent_find:
auto it = std::adjacent_find( originalvec.begin(), originalvec.end(), []( int i1, int i2 ) {
return i1 == 6 and i2 == 7;
} );
答案 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;
}