检查项目是否在列表中的简单方法?

时间:2010-04-20 04:42:15

标签: c++ list if-statement

我正在用C ++编写一个搜索算法,我需要做的一件事就是有一些if语句来检查上面,下面,左边和右边的单元格。

每次发现一个单元格被打开并添加到堆栈中时,我希望它被添加到已经检查过的单元格列表中。

我希望能够在if语句if(thisCell is not in checkedCells)中说出来。

任何简单的想法?

谢谢!

2 个答案:

答案 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);
}