我正在用C ++编写一个搜索算法,我需要做的一件事就是有一些if语句来检查上面,下面,左边和右边的单元格。
每次发现一个单元格被打开并添加到堆栈中时,我希望它被添加到已经检查过的单元格列表中。
我希望能够在if语句if(thisCell is not in checkedCells)
中说出来。
任何简单的想法?
谢谢!
答案 0 :(得分:7)
为此目的,最好使用std::set
容器,因为它使您能够比列表更快地搜索项目。然后你可以写:
std::set<itemType> myset;
...
if (myset.find(item) != myset.end()) {
// item is found
}
谷歌搜索可以找到一个更大的例子。例如,here。
答案 1 :(得分:3)
如果项目数量为数百,您可以使用简单的顺序搜索。该算法作为find()
函数内置于C ++中:
#include <algorithm> // for find()
typedef std::vector<Cell> CellList;
CellList checked_cells;
// .....
Cell cellToSearch;
if (is_in_checked_cells (cellToSearch, cells))
{
// .....
}
// Makes a sequential search using find().
static bool
is_in_checked_cells (const Cell &cell, const CellList &cells)
{
CellList::const_iterator end = cells.end ();
CellList::const_iterator item = std::find (cells.begin (), end, cell);
return (item != end);
}
确保Cell
已覆盖operator<
。
如果列表非常大,您可能想要使用二进制搜索,它也与C ++捆绑在一起:
#include <algorithm> // for sort() and binary_search()
CellList checked_cells;
// Make sure the cells are sorted.
checked_cells.sort (checked_cells.begin (), checked_cells.end ());
Cell cellToSearch;
if (is_in_checked_cells (cellToSearch, cells))
{
// .....
}
// Searches using binary_search().
static bool
is_in_checked_cells (const Cell &cell, const CellList &cells)
{
return std::binary_search (cells.begin (), cells.end (), cell);
}