【问题标题】:Is there a way to create a looped array in c++有没有办法在 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 循环放入第二个循环中。我假设在某个点/条件满足你会想要停止循环......
  • 你想要一个不断循环的数组?
  • 搜索词:“循环缓冲区”。

标签: c++ arrays loops


【解决方案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;
        }
    
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 2014-06-03
      • 2020-11-20
      • 2020-12-16
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多