Mam tablicę w stylu C o nazwie board
, która zawiera niektóre z nich: char
. Próbuję utworzyć std::array
lub std::vector
(albo byłoby w porządku, chociaż najlepiej byłoby użyć std::array
) do przechowywania wszystkich indeksów board
, które są pewną wartością (w moim przypadku, 0
).
Kod ten napisałem jest funkcjonalny i dobrze działa:Funkcja biblioteki standardowej w celu utworzenia tablicy indeksów, której odpowiadająca wartość to podana liczba.
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);
}
}
Jednak z dotychczasowych doświadczeń, ilekroć std
funkcja istnieje, który może zastąpić część mojego kodu, to terser i stąd stylistycznie preferowane i również szybciej. Moja funkcja wydaje się dość prostą operacją - wiem, że istnieje standardowa funkcja *, która umożliwia dostęp do indeksu tablicy zawierającej wartość, gdy ta wartość występuje tylko raz ** w tablicy. Czy istnieje standardowa funkcja tworzenia tablicy indeksów zawierających wartość, zakładając, że istnieje więcej niż jeden taki indeks?
* Technicznie dwie zagnieżdżone wywołania funkcji: int x = std::distance(board, std::find(board, board + 16, 0));
. Zobacz the accepted answer here.
** Cóż, nadal działa, jeśli obecny jest więcej niż jeden indeks o pożądanej wartości, ale zwraca tylko pierwszy taki indeks, co nie jest zbyt użyteczne w moim kontekście.
Edit: Jako jedną z odpowiedzi na pytanie źle, będę wyjaśnić, co ja szukam. Powiedzmy, że mamy:
char board[16] = {0, 2, 0, 4,
2, 4, 8, 2,
0, 0, 8, 4,
2, 0, 0, 2};
Teraz indeksy których szukam są {0, 2, 8, 9, 13, 14}
ponieważ board[0] = 0
, board[2] = 0
, board[8] = 0
, itd. I są to tylko liczby, które spełniają tej nieruchomości.
Boost.ranges może to zrobić. –
Miałem na myśli 'boost :: filter_iterator' –
Ten kod wygląda dobrze, z wyjątkiem początkowego wywołania" zeroes.reserve (16) ". Wywołania 'push_back' dopasują rozmiar' zeroes' w razie potrzeby, a gdy skończy się, 'zeroes.size()' wskaże liczbę indeksów. –