【问题标题】:Operations on 1-D array一维数组上的操作
【发布时间】:2011-04-15 08:16:52
【问题描述】:

如何插入和删除一维数组的元素。
例如:
假设数组是:1 3 4 2 5
我们想在 3 和 4 之间插入 7,这样新的数组就是:1 3 7 4 2 5

【问题讨论】:

    标签: c++


    【解决方案1】:

    使用 std::vector 而不是 C 样式的数组。

    使用insert 插入元素,使用erase 删除元素。

    【讨论】:

    • 你能给我简单的for循环和while循环的可能语法
    • @user451990 - 这个站点上有大量的 STL 矢量迭代示例代码。你能追踪它而不是在这里请求重新发布吗?
    • 如果你的数组很大,像这样插入会变得很昂贵。在这种情况下考虑 std::list (恒定时间插入/删除)
    • @Steve:这是我们在这里讨论的整数列表。这必须变得真正很大,以便在高度本地化数据上的内存移动比具有糟糕局部性的std::list 慢。
    • @Steve:是的,理论上链表在中间插入/删除时比数组快。然而,在实践中,即使在这种情况下,std::vector 也经常获胜(这通常归因于其数据的更高局部性,这应该与处理器缓存更好地配合)。好吧,这至少适用于 C++。我不知道它是否也适用于解释和/或特征 GC 的语言。
    【解决方案2】:

    当您想要插入或删除一个元素时,数组不是很容易处理。您必须手动将数据向前复制 1 个位置以插入 1 个元素以使新插槽可用。

    要减少工作量,您可以使用 STL 向量:

    #include <vector>
    
    //...
    
    std::vector<int> v;
    v.push_back(1);
    v.push_back(3);
    v.push_back(4);
    v.push_back(2);
    v.push_back(5);
    v.insert(v.begin() + 2, 7);
    v.erase(v.begin());//Removing the first element just for fun
    

    即使使用矢量,您仍在复制数据(只是对您透明)。因此,要最有效地执行此操作,您将使用std::list

    #include <list>
    
    //...
    
    std::list<int> v;
    v.push_back(1);
    v.push_back(3);
    v.push_back(4);
    v.push_back(2);
    v.push_back(5);
    v.insert(++(++v.begin()), 7);
    v.erase(v.begin());//Removing the first element just for fun
    

    【讨论】:

      【解决方案3】:

      您不能在 C++ 中对数组执行此操作——您必须重新分配数组并移动元素。改用std::vectorinsert 方法:

      std::vector<int> v;
      v.push_back( 1 );
      v.push_back( 3 );
      v.push_back( 4 );
      v.push_back( 2 );
      v.push_back( 5 );
      
      // begin() yields an iterator to the first element; since it's a random-access
      // iterator we can offset to insert at index 2.
      v.insert( v.begin() + 2, 7 );
      

      erase 可以以类似的方式用于删除项目。

      【讨论】:

        【解决方案4】:

        如果你想插入元素,那么使用列表会更合适——数组是连续的内存块,所以如果你想插入一些东西,你必须做一些工作:

        increase the size of the array
        for each element past the spot - move one element further back
        write new element at the target position
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-01-24
          • 2014-07-19
          • 2018-07-25
          • 1970-01-01
          • 2019-03-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多