插入到数组的所需元素中,并在c ++中将所有其他元素推到一个位置

时间:2011-06-23 02:15:35

标签: c++ arrays

我正在为一项家庭作业做一些小函数的问题。

我的静态数组大小为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,但是,我有一个单独的打印功能,只能打印到某个元素。

无论我多少次拿铅笔和纸张并手动写出我的逻辑,我都无法让它发挥作用。

任何帮助都将不胜感激,谢谢。

3 个答案:

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