有没有办法在 C++ 中创建一个循环数组

Posted

技术标签:

【中文标题】有没有办法在 C++ 中创建一个循环数组【英文标题】:Is there a way to create a looped array in c++ 【发布时间】:2019-03-21 21:34:03 【问题描述】:

好的,所以我有一个问题,我怀疑它是一个实际的 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...

【问题讨论】:

我不是 100% 确定你在问什么,但我想在用于索引数组的变量上使用模运算符可能是你想要的。 “如果您需要我澄清,请告诉我” 是的,澄清会有所帮助。也许你可以用代码展示你需要什么? 也许您只想将基于范围的 for 循环放入第二个循环中。我假设在某个点/条件满足你会想要停止循环...... 你想要一个不断循环的数组? 搜索词:“循环缓冲区”。 【参考方案1】:

内置数组类型不会这样做。如果你愿意,很容易创建一个带有重载运算符的类型来完成这项工作。

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】:

你不需要一个“循环数组”,据我所知,C++ 中不存在这样的东西。

您可以通过循环索引轻松实现相同的效果。

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

【讨论】:

根据运行时间、迭代速度以及索引变量的大小,有时最好使用if (++i &gt;= 14) i = 0; 来防止索引溢出。 太棒了,非常感谢,这正是我想知道的! @user4581301 我对 mancala 游戏不是很熟悉,但据我了解,用户会选择 14 个杯子中的一个,然后您将循环重新分配棋子。因此,将达到的最高索引将是 14+numberOfPieces,这对于所有 poppolar 索引类型来说都足够小。【参考方案3】:

我所知道的(或所有与此相关的编程)在 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;
    



【讨论】:

以上是关于有没有办法在 C++ 中创建一个循环数组的主要内容,如果未能解决你的问题,请参考以下文章

循环遍历数组以在反应路由器中创建路由

在 discord.js 中创建一个用于从数组中查找和终止角色的 for 循环

如何在 Javascript 中创建多维数组? [复制]

在 PHP 中创建关联数组的数组

在 cython 的循环中创建 c++ 映射

我想将以下行存储到 C++ 中的字符串数组中。我该怎么做?