【问题标题】:Hiding iteration in a function在函数中隐藏迭代
【发布时间】:2011-03-14 23:02:09
【问题描述】:

我只是粗略地知道我想要什么,也许有人可以把它填出来和/或告诉我是否可能。

我想简化我的多重嵌套循环,为此我希望能够调用返回目录中文件的函数(例如使用 boost::filesystem),每次连续调用都会返回下一个文件,直到全部用完。我也希望能够用向量来做到这一点,并让函数返回连续的元素。

任何想法如何做到这一点?谢谢

【问题讨论】:

  • 听起来您正在尝试重新发明迭代器。迭代器是使用std::vector 的一种相当正常的方式。 boost::filesystem 也有 directory_iterator
  • @Jerry - 我对向量和文件系统都使用了迭代器,但我想避免嵌套迭代器循环,因为它们有 10 深并且会从屏幕右侧消失。

标签: c++ function boost vector iterator


【解决方案1】:

创建一个仿函数:一个像函数一样被调用的对象。

该对象将保存查询结果和查询的当前状态。您定义了一个operator(),以便可以像调用函数一样调用该对象。每次调用此函数时,您都会返回一个结果并更新对象的内部状态。

示例:

#include <iostream>

using namespace std;

class CountDown {
        unsigned count;
public:
        CountDown(unsigned count) : count(count) {}
        bool operator()() { return count-- > 0; }
};

int main()
{
        CountDown cd(5);
        while( cd() ) {
                cout << "Counting" << endl;
        }
        return 0;
}

【讨论】:

  • 谢谢Zan,能给我一个例子吗?
【解决方案2】:

使用迭代器模式。在 Java 中你会有这样的东西:

class FileIterator {
  private int index;
  private File[] files;

  public FileIterator(File[] files) {
    this.files = files;
    this.index = 0;
  }

  public boolean hasNext() {
    if (index < files.length - 1) { 
      return true;
    } else {
      return false;
    }
  }
  public File next() {
    return this.files [index ++];
  }
}

你会这样使用它:

FileIterator it = new FileIterator(theFiles);
while (it.hasNext()) {
  File f = it.next();
}

【讨论】:

    【解决方案3】:

    您可以使用 BOOST_FOREACH 来简化循环 link to docsstackoverflow

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多