如何将 std::find() 与 2d std: 数组一起使用?
How to use std::find() with a 2d std: array?
我正在编写一个函数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::set
或std::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;
}
现场演示
- 将fold表达式与std::一起用于两个元组
- 将 std::allocate_shared 与多态资源分配器一起使用
- 将 std::set 与基于键的比较器一起使用
- 如何将AERT_Allocate与 std:vector 一起使用
- 将用户定义的类型与 std::vector 和 std::sort 一起使用
- 将图形属性与 std::unique_ptr 捆绑在一起
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- 将新放置与 std::函数一起使用不起作用
- 不能将C++的"std::filesystem"库与介子构建一起使用
- 将 std::function 与模板一起使用
- 是否可以将 std::basic_ifstream 和 std::basic_ofstream 与自定义缓冲区一起使用?
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 如何将 std::find() 与 2d std: 数组一起使用?
- boost::interprocess::file_lock 与 std::ostream 一起使用时的错误行为
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 将 std::transform 与 std::back_inserter 一起使用是否有效?
- 为什么使用与父级声明的 std::function 在与子级一起使用时会显示错误?
- 是否已经有一个 constexpr std::bit_cast 与 g++ 一起使用
- 将 std::variant 与 gmock 1.8 对象一起使用时编译错误
- 我不能将 'fill' std::vector 构造函数与 unique_ptrs 一起使用