我有一个名为board
的C风格数组,其中包含一些char
个数组。我尝试创建std::array
或std::vector
(要么会更好,尽管std::array
会更好)来存储board
的所有索引某些价值(在我的情况下,0
)
我写的这段代码功能齐全,效果很好:
std::vector<int> zeroes;
zeroes.reserve(16);
//board has 16 elements, so zeroes.size() will never be larger than 16.
//I used this reserve for speedup - the compiler doesn't require it.
for (int i = 0; i < 16; ++i)
{
if (board[i] == 0)
{
zeroes.push_back(i);
}
}
然而,根据过去的经验,只要存在可以替换我的部分代码的std
函数,它就更简洁,因此风格更受欢迎,也更快。我的函数似乎是一个相当基本的操作 - 我知道有一个标准函数*来访问数组的索引,该数组包含一个值,当该值只在数组中出现**时。那么,是否存在一个标准函数来创建包含值的索引数组,假设存在多个这样的索引?
*技术上,两个嵌套函数调用:int x = std::distance(board, std::find(board, board + 16, 0));
。见the accepted answer here。
**好吧,如果存在多个具有所需值的索引,它仍然有效,但它只返回第一个这样的索引,这在我的上下文中并不是非常有用。
编辑: 由于其中一个答案误解了这个问题,我将澄清我所寻求的内容。我们说我们有:
char board[16] = {0, 2, 0, 4,
2, 4, 8, 2,
0, 0, 8, 4,
2, 0, 0, 2};
现在,我正在寻找的指数是{0, 2, 8, 9, 13, 14}
,因为board[0] = 0
,board[2] = 0
,board[8] = 0
等等,这些是唯一满足的数字该财产。
答案 0 :(得分:6)
以下是使用std::iota
和std::remove_if
的解决方案:
#include <algorithm>
#include <iostream>
int main () {
const std::size_t board_size = 16;
char board [board_size] = {
0, 2, 0, 4,
2, 4, 8, 2,
0, 0, 8, 4,
2, 0, 0, 2
};
// Initialize a zero-filled vector of the appropriate size.
std::vector<int> zeroes(board_size);
// Fill the vector with index values (0 through board_size - 1).
std::iota(zeroes.begin(), zeroes.end(), 0);
// Remove the index values that do not correspond to zero elements in the board.
zeroes.erase(std::remove_if(zeroes.begin(), zeroes.end(), [&board] (int i) {
return board[i] != 0;
}), zeroes.end());
// Output the resulting contents of the vector.
for (int i : zeroes) {
std::cout << i << std::endl;
}
}
程序的输出(demo):
0
2
8
9
13
14