有没有办法在 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 >= 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++ 中创建一个循环数组的主要内容,如果未能解决你的问题,请参考以下文章