标准库函数,用于创建索引数组,其对应值为给定数字

时间:2016-06-01 00:41:53

标签: c++ arrays c++11 c++-standard-library

我有一个名为board的C风格数组,其中包含一些char个数组。我尝试创建std::arraystd::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] = 0board[2] = 0board[8] = 0等等,这些是唯一满足的数字该财产。

1 个答案:

答案 0 :(得分:6)

以下是使用std::iotastd::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