Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 优化C++;搜索向量_C++_Optimization - Fatal编程技术网

C++ 优化C++;搜索向量

C++ 优化C++;搜索向量,c++,optimization,C++,Optimization,在我目前的项目中,我尽了最大努力坚持过早优化是万恶之源的原则。但是,现在代码已经过测试,是时候进行优化了。我做了一些分析,结果发现我的代码在一个函数中花费了将近20%的时间,在这个函数中,它找到了所有可能的子元素,将它们放在一个向量中,然后返回它们。请注意,我正在优化速度,内存限制不是一个因素 现在,函数如下所示: void Board::GetBoardChildren(std::vector<Board> &children) { children.reserve

在我目前的项目中,我尽了最大努力坚持过早优化是万恶之源的原则。但是,现在代码已经过测试,是时候进行优化了。我做了一些分析,结果发现我的代码在一个函数中花费了将近20%的时间,在这个函数中,它找到了所有可能的子元素,将它们放在一个向量中,然后返回它们。请注意,我正在优化速度,内存限制不是一个因素

现在,函数如下所示:

void Board::GetBoardChildren(std::vector<Board> &children)
{
    children.reserve(open_columns_.size()); // only reserve max number of children

    UpdateOpenColumns();

    for (auto i : open_columns_)
    {
        short position_adding_to = ColumnToPosition(i);
        MakeMove(position_adding_to); // make the possible move
        children.push_back(*this); // add to vector of children
        ReverseMove(); // undo move
    }
}
std::vector<Board> current_children;
current_state.GetBoardChildren(current_children);

我在想,既然可能的子对象的最大数量很小(7),那么使用数组会更好吗?或者我能做的不是很多来优化这个功能吗?

从你对我评论的回复来看,似乎大部分时间都花在了抄写黑板上

children.push_back(*this);
你需要找到一种避免制作所有这些拷贝的方法,或者一种使它们更便宜的方法


简单地将向量更改为数组或列表可能不会对性能产生任何影响。

最重要的问题是:您真的需要当前状态中的所有状态同时出现吗? 如果您只是按照默认顺序对它们迭代一两次,那么就不需要向量,只需根据需要生成它们

如果你真的需要它,下面是下一步。由于
Board
的复制成本很高,因此只跟踪差异的
DifferenceBoard
可能会更好。伪代码:

struct DifferenceBoard { // or maybe inherit from Board that a DifferenceBoard
                         // can be built from another DifferenceBoard
  Board *original;
  int fromposition, toposition;
  State state_at_position;

  State get(int y, int x) const {
    if ((x,y) == fromposition) return Empty;
    if ((x,y) == toposition  ) return state_at_position;
    return original->get();
  }
};

子对象。向后推(*此)
制作
对象的副本。制作那个副本有多贵?@NPE这个操作非常昂贵,它是一个相当大的对象。然而,我没有找到复制的方法。我使用的是深度优先算法,据我所知,我需要为每个可能的孩子提供一份新的副本。我想大部分时间都是这样。“我认为向量本身是一条红鲱鱼。”@SidharthMudgal不,我不是通过索引访问的。我一直认为,对于小集合,像这样的代码, List更昂贵,因为它是双链接KiSudie<代码>:::板(板const &)//>实际上实现(而不是内联)或C++使用泛型复制构造函数。这就解释了为什么探查器用
push_back
而不是实际的复制构造函数来指向行。非常有趣。我会回去看看算法,看看是否可以减少拷贝。“让它们更便宜”是否比仅仅减少尺寸更重要?我使用的是默认的复制构造函数。@Kyryx:它取决于
类的内容。例如,如果它包含一些在单板之间相同且不可变的字段,那么通过指针而不是通过值复制它们可能会更便宜。