如何将数组重新分配给另一个数组?

时间:2017-08-09 05:43:53

标签: c++ arrays class pointers

是否可以将数组重新分配给另一个数组?像这样: 这是功能e02:

void e02(){
    int a[] = {15, 9, 8, 4, 3};
    int n = 5;
    int x = 5;

    fn02(a, n, x);

    cout << endl;

    for(int i = 0; i < n; i++){
        cout << a[i] << " ";
    }
}

这是函数fn02:

void fn02(int* a, int &n, int x){
    n += 1;

    int* b = new int[n];

    int j = 0;

    bool put = false;

    for(int i = 0; i < n; i++){
        if(x > a[i] && put == false){
            b[j] = x;
            j++;
            a--;
            put = true;
        } else{
            b[j] = a[i];
            j++;
        } //else
    } //i loop

    a = b;
}

这应该将变量n放入数组中,但数组仍然需要降序。如果我只是像这样分配a = b那么我得到输出15,9,8,4,3,5,其中5是垃圾值。所以我的问题是:有没有办法将数组重新分配给不同的数组? 如果我使用像

这样的指针
int* &p1;

然后把它放在我得到我想要的函数中但是函数必须有那些参数并且必须是无效的

3 个答案:

答案 0 :(得分:1)

我将提供一些可能有助于您找到问题解决方案的概念。然后提供快速解决方案,帮助您找到最终解决方案。

...如果我只是像这样分配a = b那么我得到输出15,9,8,4,3,5,其中5是垃圾值。

数字5的输出与fcn02中a = b的赋值无关。值5实际上是调用函数中x的值。您正在访问它的原始分配范围之外的数组,从而访问int大小的下一个地址的值。在这种情况下,它是x的值。如果你吐出x的地址和[6]的地址,你会发现它们是相等的。

由于将值传递给函数的基本概念,您在a = b的fcn02中的赋值不能按预期工作。当您调用函数fcn02(a)时,值为&#34; a&#34; (数组开头的地址)被复制到&#34; a&#34;的值。在fcn02。改变&#34; a&#34;在fcn02中不会改变&#34; a&#34;在调用函数中。

澄清示例注意(使用相同的值&#34; a&#34;可能会让人感到困惑,所以我稍微改了一下)。

int func02( int* b ) // address of a is copied to b
{

     ... // some code...c is dynamically allocated and has an address of 0x80004d30
     b = c;  // b is set to address of c; thus, b address is now 0x80004d30
     // a is unchanged and you now have a memory leak since you didn't delete b.
}

int main()
{
    int a[5] = {1,2,3,4}; // address is 0x28cc58
    func02(a);  // complier will make a copy of the value of a to b
    // address (i.e. value) of a is still 0x28cc58

}

内存布局为什么你看到5:

int a[5] = {1,2,3,4,5};  // 0x28cc64 
int x = 7;               // 0x28cc5c

{    array a            }{ x  }
 ---- ---- ---- ---- ---- ---- 
| 1  | 2  | 3  | 4  | 5  | 7  | 
 ---- ---- ---- ---- ---- ----

然而,为了回答你的问题,你不能将一个数组分配给另一个。

int a[5] = {1,2,3,4,5};
int b[5];
b = a;
for ( int i = 0; i<5; ++i )
{
     cout << b[i] << endl;
}

编译器不允许这样做。

这是快速而肮脏的解决方案,保持您的功能参数相同,以获得指导:

void e02(){
    int a[6] = {15, 9, 8, 4, 3, 0};
    int sizeofA = 5;
    int numToAdd = 5;

    fn02(a, sizeofA, numToAdd);
    cout << endl;

    for(int i = 0; i < n; i++){
        cout << a[i] << " ";
    }
}

void fn02(int* a, int &n, int x){
    n += 1;
    int i = 0;
    while( i < n )
    {
        if ( a[i] > x )
        ++i;
        else {
        int tmp = a[i];
        a[i] = x;
        x = tmp;
        }
    }
}

答案 1 :(得分:0)

为了在排序向量中插入元素(递减顺序),您可以尝试:

#include <iostream>
#include <vector>
using namespace std;

void InsertItemInSortedArray(std::vector<int>& vec, int item)
{
    auto high_pos=std::lower_bound (vec.rbegin(), vec.rend(), item);
    vec.insert(high_pos.base(), item);
}

int main() {
    std::vector<int> vec = {15, 9, 8, 4, 3};
    int item = 5;
    InsertItemInSortedArray(vec, item);

    for (const auto& elem : vec) 
    {
        std::cout << elem << std::endl;
    }
    return 0;
}

答案 2 :(得分:-3)

它是如此简单,您只需要执行<button>