Есть ли способ создать зацикленный массив в C ++ - PullRequest
0 голосов
/ 22 марта 2019

Хорошо, поэтому у меня есть вопрос, который, я сомневаюсь, является реальной функцией c ++, но она того стоит ... Я создаю основанную на терминале текстовую игру mancala и использую массив дляотслеживать точки в каждой чашке доски, мне было интересно, есть ли способ, если пользователь запускает, скажем, "boardArray [13]" чашку, и поток массива идет в хронологическом порядке, я хочузначение boardArray [13], чтобы вернуться к началу доски и начать распространение обратно в boardArray [1].Я сомневаюсь, что это имеет смысл, дайте мне знать, если вам нужно, чтобы я уточнить.Я в основном хочу массив, который идет

1,2,3,4,5,6,7,8,9,10,11,12,13,14, RESET 
1,2,3,4,5,6,7,8,9,10,11,12,13,14, RESET
1,2,3...

Ответы [ 3 ]

3 голосов
/ 22 марта 2019

Встроенный тип массива этого не сделает. Если хотите, довольно просто создать тип с перегруженным оператором для выполнения этой работы.

template <std::size_t N>
class LoopedArray {
    int data[N];
public:
    int &operator[](size_t index) { 
        return data[index % N];
    }
};

int main() {
    LoopedArray<13> la;

    // put known values into the array:
    for (int i=0; i<13; i++)
        la[i] = i;

    // demonstrate reading the data with "looping" of the index:
    for (int i=0; i<100; i++)
        std::cout << la[i] << "\t";
}

Возникает вопрос: действительно ли я бы порекомендовал сделать это, но это, безусловно, можно сделать, и, полагаю, я могу поверить, что это может быть полезно ...

2 голосов
/ 22 марта 2019

Для этого вам не нужен "зацикленный массив", такого, насколько я знаю, в C ++ не существует.

Вы можете добиться того же эффекта очень легко, зациклив свой индекс.

Вместо использования yourArray[i] просто используйте yourArray[i%14], чтобы получить доступ только к первым 14 его элементам.

0 голосов
/ 22 марта 2019

Такого массива в C ++ не существует, о котором я знаю (или вообще о программировании).

То, что вы можете попробовать, это связанный список:

class node {
public:
    node* next;
    int value;

}

Затем свяжите несколько вместе:

node root;
node* current=&root
for(i=0;i<14;i++) {
    current->value=0; // for initialization
    current->next = new node;
    current = current->next;
}
current->next = root;

Эти элементы будут связаны в цикле.Вы можете получить к ним доступ вот так

int value = current->value;
for(int i=0;i<value;i++) {
    current = current->next;
    current.value +=1;
}

Конечно, это становится довольно грязно, особенно когда вы пытаетесь удалить его.

void DeleteList(node *n,node *root) {
    if(n == root) {
        return;
    }
    DeleteList(n->next,root);
    delete n;
}

Это всего лишь пример, но он может иметьмного проблем быстро.

То, что я действительно рекомендую рекомендовать, похоже на то, что AlbertM рекомендовал , но заключено в приятную для вас функцию:

void addPoints(int arr[], int cup, int arrlen) {
    int value = arr[cup]; // stored for later    
    arr[cup] = 0; // since we are emptying the cup

    for(int i=0; i<value;i++) {
        arr[(cup+i)%arrlen] += 1;
    }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...