通过使用指针/引用,在C ++中使用向量加快计算速度

时间:2019-04-03 16:24:49

标签: c++ pointers vector reference

当前,我正在编写一个解决数独的C ++程序。为此,我经常计算数独的“能量”(故障数)。不幸的是,该计算占用了大量的计算时间。我认为可以通过在计算中使用指针和引用来显着提高它的速度,但是很难弄清楚如何实现此目标。

在我的求解器类中,我有一个名为vector<vector<int>的{​​{1}}数据成员,其中包含每个站点的值。当前,在计算能量时,我使用传递值调用了许多函数。我尝试在创建变量时在函数的参数中添加&并在*中添加*,但这不起作用。如何通过引用传递使该程序运行更快?

计算能量不应改变矢量,这样会更好。

我使用CPU使用率来追踪80%的计算时间到调用向量的函数。

_sudoku

使用大量计算时间的特定行如下: int SudokuSolver::calculateEnergy() { int energy = 243 - (rowUniques() + colUniques() + blockUniques());//count number as faults return energy; } int SudokuSolver::colUniques() { int count = 0; for (int col = 0; col < _dim; col++) { vector<int> colVec = _sudoku[col]; for (int i = 1; i <= _dim; i++) { if (isUnique(colVec, i)) { count++; } } } return count; } int SudokuSolver::rowUniques() { int count = 0; for (int row = 0; row < _dim; row++) { vector<int> rowVec(_dim); for (int i = 0; i < _dim; i++) { rowVec[i] = _sudoku[i][row]; } for (int i = 1; i <= _dim; i++) { if (isUnique(rowVec, i)) { count++; } } } return count; } int SudokuSolver::blockUniques() { int count = 0; for (int nBlock = 0; nBlock < _dim; nBlock++) { vector<int> blockVec = blockMaker(nBlock); for (int i = 1; i <= _dim; i++) { if (isUnique(blockVec, i)) { count++; } } } return count; } vector<int> SudokuSolver::blockMaker(int No) { vector<int> block(_dim); int xmin = 3 * (No % 3); int ymin = 3 * (No / 3); int col, row; for (int i = 0; i < _dim; i++) { col = xmin + (i % 3); row = ymin + (i / 3); block[i] = _sudoku[col][row]; } return block; } bool SudokuSolver::isUnique(vector<int> v, int n) { int count = 0; for (int i = 0; i < _dim; i++) { if (v[i] == n) { count++; } } if (count == 1) { return true; } else { return false; } } 并且每次调用vector<int> colVec = _sudoku[col];

我希望,如果我切换到使用按引用传递,我的代码将大大加快速度。如果确实是这样的话,有人可以帮助我吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

如果将SudokuSolver::isUnique更改为vector<int> &v,这是唯一需要进行按引用传递而不是按值传递的更改。用指针传递将类似于通过引用传递,区别在于可以重新分配指针或将其设置为NULL,而不能通过引用传递指针。

我怀疑如果您正在处理足够大的问题,您将能够区分出较大的副本(如果问题很小,则很难看到次要的性能提升),您会看到性能提高。

希望这会有所帮助!

答案 1 :(得分:1)

Microsoft Outlook 16.0 Object Library确实复制/传输所有元素,而vector<int> colVec = _sudoku[col];不会(仅为右侧创建别名)。

const vector<int>& colVec = _sudoku[col];bool SudokuSolver::isUnique(vector<int> v, int n) {相同

根据Jesper Juhl的建议进行编辑:bool SudokuSolver::isUnique(const vector<int>& v, int n) {的添加可确保您不会错误地更改参考内容。

编辑2:还要注意的另一件事是,const这些向量在每次迭代时都是连续分配和未分配的,这可能会增加成本。您可以尝试类似

vector<int> rowVec(_dim);

如果这不影响您的实施。