需要遍历整个对象,除了前两个元素。有设计模式吗?

nor*_*ner 1 c++ foreach loops design-patterns

我有一个std::vector我想迭代除前两个对象之外的每个对象。如果我不想要两个,foreach 循环将是完美的。IEfor(const auto i : items)

我想到的可能解决方案是擦除前两个并在最后重新添加

const auto firstEle = myVec[0];
const auto secEle = myVec[1];
myVec.erase(myVec.begin());
myVec.erase(myVec.begin());
for(const auto i : items)
{
  //do stuff with i
}
myVec.insert(myVec.begin(), secEle);
myVec.insert(myVec.begin(), firstEle);
Run Code Online (Sandbox Code Playgroud)

或者有某种旗帜

unsigned int i = 0;
for(const auto j : items)
{
  if(i < 2)
  {
    i++;
    continue;
   }
   //do stuff with j
}
Run Code Online (Sandbox Code Playgroud)

或使用 while 循环

unsigned int i = 2;
while(i < myVec.size())
{
  const auto j = myVec[i];
  //do stuff with j

  i++;
}
Run Code Online (Sandbox Code Playgroud)

所有这些似乎都比它们需要的要复杂。有没有更好更简单的解决方案?

kab*_*nus 7

我通常使用传统的循环来处理这些事情:

// verify myVec.size() > 2
for(auto it = myVec.begin()+2; it != myVec.end(); ++it) {
    // work
}
Run Code Online (Sandbox Code Playgroud)

如果你想要 C++11 lambda 魔法,那么

std::for_each(v.begin()+2, v.end(), [](auto& element) {
     // do stuff
});
Run Code Online (Sandbox Code Playgroud)

会做的。

  • 或者,您可以使用 std::advance 跳过前两个元素,但无论您是否这样做,我仍然会推荐此答案中的方法,而不是问题中的方法。 (3认同)