我正在为一项家庭作业做一些小函数的问题。
我的静态数组大小为20(shelfSize),但是,我只需要使用最多10个元素。所以我不必担心越界等(整个20的数组被初始化为0)。
我要做的是将一个整数booknum插入到它作为输入接收的数组的元素中。
这是我目前的逻辑:
void insert_at(int booknum, int element){
for(int i=element+1; i < shelfSize; i++)
bookshelf[i+1]=bookshelf[i]
bookshelf[element]=booknum;
}
所以让我说我有这个数组:
[5,4,3,1,7]
我想在元素1处插入8并将数组转到:
[5,8,4,3,1,7]
从技术上讲,最终元素7之后的所有内容都是0,但是,我有一个单独的打印功能,只能打印到某个元素。
无论我多少次拿铅笔和纸张并手动写出我的逻辑,我都无法让它发挥作用。
任何帮助都将不胜感激,谢谢。
答案 0 :(得分:1)
如果您的示例是正确的,那么您假设基于1的索引而不是基于0的索引。请改用以下内容:
void insert_at(int booknum, int element){
for(int i=element; i < shelfSize; i++)
bookshelf[i]=bookshelf[i-1];
bookshelf[element-1]=booknum;
}
但是,我希望您只使用相同的代码,并将示例中的“at element 2”更改为“at element 1”。永远记住C ++数组是基于0的。
话虽如此,请告诉您的教授,这就是为什么制作矢量(和其他标准容器),以及C ++数组是邪恶的。
http://www.parashift.com/c++-faq-lite/containers.html#faq-34.1
答案 1 :(得分:1)
刚刚注意到,你正在复制,这意味着你的功能是这样做的:
[5,4,3,1,7]
--^
[5,4,4,1,7]
--^
[5,4,4,4,7]
--^
[5,4,4,4,4]
--^
[5,4,4,4,4,4]
对于在数组中移动值,您总是希望以与移动方向相反的方向进行复制,因此要向上移动,您希望从上到下复制每个项目:
[5,4,3,1,7]
--^
[5,4,3,1,7,7]
--^
[5,4,3,1,1,7]
--^
[5,4,3,3,1,7]
--^
[5,4,4,3,1,7]
然后你可以覆盖你释放的索引。
答案 2 :(得分:1)
你应该从数组的末尾开始,这应该为你说:
void insert_at(int booknum, int element)
{
for (int i = shelfsize-1;i>element;i--)
bookshelf[i] = bookshelf[i-1];
bookshelf[element] = booknum;
}
另外,我建议您习惯于处理非法值,例如,如果用户输入了21?
优化的代码是:
bool insert_at(int booknum, int element)
{
if (element>=shelfsize-1)
return false;
for (int i = shelfsize-2;i>element;i--)
bookshelf[i] = bookshelf[i-1];
bookshelf[element] = booknum;
return true;
}