如何将 std::find() 与 2d std: 数组一起使用?

How to use std::find() with a 2d std: array?

本文关键字:std 一起 数组 2d find      更新时间:2023-10-16

我正在编写一个函数CreateGrid(),该函数试图将std::string和 2dstd::array作为参数,并将std::string中的各个字符放入数组中。如果留有空格,数组的其余部分应按字母顺序填充字母字符 A-Y(包括字母顺序(,前提是它们尚未出现在std::string中。每个字符在最终返回的数组中只应出现一次。

所以对于输入string keyword = "HELO";

输出将是:

H E L 奥阿 C D F

请注意,字符"E"只出现一次。

我正在尝试使用std::find()来测试字母 A-Y(Z 故意排除(中的所有字符是否由于关键字而已经在数组中,如果不是这样就没有重复项,然后再插入它。我收到编译错误。

法典:

array<array<char,3>,3> CreateGrid(std::string keyword, array<array<char,3>,3> myArray)
{
char letterToFind = 'A';
for (int row = (keywordLength/3); row < 3; row++ )
{
for (int column = (keywordLength % 3); column < 3; column++)
{
auto it = std::find(begin(myArray), end(myArray), letterToFind);
if ( it == end(myArray) ) // value not in array
{
myArray[row][column] = letterToFind;  //insert
}
letterToFind++;
}
}
return myArray;
}
int main()
{
array<array<char,3>,3> myArray = { {'H','E','L'}, {'O','+','+'}, {'+','+','+'} };
CreateGrid("HELO", myArray);
return 0;
}

我收到此行的编译错误:

auto it = std::find(begin(myArray), end(myArray), letterToFind);
消息 :请参阅对函数模板实例化"_InIt std::find<std::_Array_iterator><_Ty,5>,char>(_InIt,const _InIt,const char &("的参考正在编译[_InIt=std::_Array_iterator<std::array><char,3>3>,_Ty=std::array<char,3>]

如何检查数组中是否已有char, 如果没有,那就添加它?

这通常不是微不足道的,因为您有嵌套数组。std::find只能将迭代器返回到外部数组,这在需要更改内部数组中的值时没有用。

但是,我注意到您实际上并没有使用it,只是查看是否找到了所寻求的元素。 因此,我们可以重新定义操作:无需在包含值的内部数组中查找元素,只需找到包含您要查找的值的任何内部数组就足够了:

auto it = std::find(
begin(myArray), end(myArray),
[letterToFind](array<char,3> const & inner) {
return std::find(begin(inner), end(inner), letterToFind) != end(inner);
}
);

如果您找到这样的内部数组,那么您就知道该值存在于 2d 数组中并且可以继续。

由于您不需要迭代器,因此您也可以改用std::any_of

bool found = std::any_of(
begin(myArray), end(myArray),
[letterToFind](array<char,3> const & inner) {
return std::find(begin(inner), end(inner), letterToFind) != end(inner);
}
);

您的myArray参数是一个包含array<char,3>元素的数组。 您使用find()仅搜索该外部数组。 所以begin(myArray)会返回一个枚举array<char,3>元素的迭代器,你不能将单个char与整个array<char,3>进行比较,这就是你的find()调用无法编译的原因。 您必须遍历在每个内部数组上调用find()的外部数组。

实现这一点的一种更简单的方法是使用查找表来跟踪您已经看到的字符,例如:

const size_t MaxRows = 3;
const size_t MaxColumns = 3;
const size_t MaxCells = MaxRows * MaxColumns;
using gridRow = std::array<char, MaxColumns>;
using grid = std::array<gridRow, MaxRows>;
grid CreateGrid(const std::string &keyword)
{
grid g;
std::array<bool, 256> lookup{};
size_t numFilled = 0;
for(size_t i = 0; (i < keyword.size()) && (numFilled < MaxCells); ++i)
{
if (!lookup[static_cast<unsigned char>(keyword[i])])
{
lookup[static_cast<unsigned char>(keyword[i])] = true;
g[numFilled / 3][numFilled % 3] = keyword[i];
++numFilled;
}
}
for(char ch = 'A'; (ch <= 'Y') && (numFilled < MaxCells); ++ch)
{
if (!lookup[static_cast<unsigned char>(ch)])
{
g[numFilled / 3][numFilled % 3] = ch;
++numFilled;
}
}
return g;
}
int main()
{
grid myArray = CreateGrid("HELO");
...
return 0;
}

现场演示

或者,您可以使用std::setstd::unordered_set进行查找:

#include <unordered_set>
const size_t MaxRows = 3;
const size_t MaxColumns = 3;
const size_t MaxCells = MaxRows * MaxColumns;
using gridRow = std::array<char, MaxColumns>;
using grid = std::array<gridRow, MaxRows>;
grid CreateGrid(const std::string &keyword)
{
grid g;
std::unordered_set<char> lookup;
size_t numFilled = 0;
for(size_t i = 0; (i < keyword.size()) && (numFilled < MaxCells); ++i)
{
if (lookup.insert(keyword[i]).second)
{
g[numFilled / 3][numFilled % 3] = keyword[i];
++numFilled;
}
}
for(char ch = 'A'; (ch <= 'Y') && (numFilled < MaxCells); ++ch)
{
if (lookup.insert(ch).second)
{
g[numFilled / 3][numFilled % 3] = ch;
++numFilled;
}
}
return g;
}
int main()
{
grid myArray = CreateGrid("HELO");
...
return 0;
}

现场演示