【问题标题】:How to safely insert an element into an array c++?如何安全地将元素插入到数组 C++ 中?
【发布时间】:2018-05-24 01:18:04
【问题描述】:

我有一个简单的程序来向数组中添加一个元素:

void printArray(int inp[], int size)
{
    cout << "[";
    for (int i = 0; i < size - 1; i++)
    {
        cout << inp[i] << ", ";
    }
    cout << inp[size - 1] << "]" << endl;
}

int addElement(int inputArray[], int inputSize, int element, int atIndex)
{
    int cur = inputSize;
    while (cur >= 0)
    {
        if (cur == atIndex)
        {
            inputArray[cur] = element;
            return inputSize + 1;
        }
        inputArray[cur] = inputArray[cur - 1];
        cur--;
    }
    return inputSize + 1;
}


int arr1[] = {1, 5, 9, 2};
int arr2[] = {1, 5, 9, 2};

int main()
{
    int arraySize = sizeof(arr1) / sizeof(arr1[0]);

    addElement(arr1, arraySize, 7, 0);
    printArray(arr1, arraySize + 1);
    printArray(arr2, arraySize);

    return 0;
}

这个输出:

[7, 1, 5, 9, 2]
[2, 5, 9, 2]

虽然我没有接触过arr2,但它已被修改。我认为是因为arr1arr2 在内存中是连续分配的,并且天真地向arr1 添加一个元素会覆盖arr2[0]

我应该如何处理这种情况,只有在下一个空间未使用时才添加,否则将整个数组移动到另一个位置?

【问题讨论】:

  • 安全的做法是不去做。使用std::vector
  • 重新发明轮子是很好的了解事情是如何运作的。但这对生产代码没有意义。因此,如果您尝试了解 std::vector 的工作原理,那么您就走对了。是的,如果你没有空间fpr新数据,你必须分配新的内存,将整个内容复制到新的地方,然后把新的数据放在那里。这还需要对元素使用复制构造等。 std::vector 提供的所有内容。
  • 感谢您指出我需要做的事情。我只是在练习,不是为任何项目写这个。
  • @Klaus 如何检查我是否没有空间存储新数据?还是每次添加元素时都应该将其复制到新位置?
  • 为了检查是否没有剩余空间,您应该存储阵列容量。没有别的办法。

标签: c++ arrays pointers


【解决方案1】:

您可以使用std::vector 轻松实现此目的。 它有一个名为insert 的方法,您只需传递一个位置和一个数字作为参数,它会自行处理重新分配。

例如:如果你写:

vector<int> vec = { 1, 2, 3, 4, 5 };
vec.insert(vec.begin() + 2, 100);

现在向量中的元素是 1、2、100、3、4、5。

我不知道这是否对你有帮助,但你也可以一次添加多个元素:

vector<int> vec = { 1, 2, 3, 4, 5 };
vec.insert(vec.begin() + 3, { 100, 101 });

现在向量中的元素是:1, 2, 3, 100, 101, 4, 5

如您所见,第一个参数是第一个插入元素的位置,第二个参数是要插入的元素或元素列表。

你可以阅读更多关于std::vectorhere和关于std::vector::inserthere的信息

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    正如@StoryTeller 提到的cmets,您可以使用std::vector。

    但是你必须选择你想要使用的容器的哪个功能,有两种类型。

    1. ::insert,在特定位置插入数据 容器。这是基于迭代器的。

    2. ::push_back,在容器的后面/最后插入

    您可以使用它们中的任何一个,具体取决于您的目的,只需确保 ::insert 您指向正确的位置(迭代器)。

    此外,从 C++11 开始,您可以使用构造和插入数据的 ::emplace::emplace_back。您可以在以下位置找到更多信息,

    http://www.cplusplus.com/reference/vector/vector/

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      我有一个简单的程序来向数组中添加一个元素:

      不可能。数组的大小在编译时是固定的。换句话说,

      int arr1[] = {1, 5, 9, 2};
      

      很像:

      int arr1_1 = 1;
      int arr1_2 = 5;
      int arr1_3 = 9;
      int arr1_4 = 2;
      

      我认为,出于学习目的,查看这样的数组是有帮助的,而不是像在程序运行时可以收缩和增长的容器。在运行时向数组添加元素就像要求在运行时添加变量一样。 C++ 数组不是这样工作的。

      可以在运行时使用new[] 设置数组的初始大小,但即便如此,您也无法“添加”任何内容。事实上,永远不要使用new[]

      访问 cppreference.com,了解 std::vector 并从头开始重新学习所有内容。从页面底部的示例代码开始。

      【讨论】:

        猜你喜欢
        • 2017-11-06
        • 1970-01-01
        • 2020-11-07
        • 1970-01-01
        • 1970-01-01
        • 2017-04-19
        • 2017-12-13
        • 2019-03-08
        • 2023-03-26
        相关资源
        最近更新 更多