有没有一种方法可以在C ++中创建循环数组

时间:2019-03-21 21:34:04

标签: c++ arrays loops

好吧,所以我有一个问题,我怀疑这是一个实际的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 个答案:

答案 0 :(得分:3)

内置数组类型不会执行此操作。如果需要的话,创建带有重载运算符的类型来完成这项工作很容易。

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";
}

我是否真的建议这样做,还有很多疑问,但是可以肯定的,我想我可以相信这可能是有用的...

答案 1 :(得分:2)

为此,您不需要“循环数组”,就我所知,这样的东西在C ++中是不存在的。

通过循环索引,您可以非常轻松地达到相同的效果。

不是使用yourArray[i],而是使用yourArray[i%14]仅访问它的前14个元素。

答案 2 :(得分:0)

我知道的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 recommended类似的东西,但是为您包装了一个不错的函数:

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;
    }

}