从main中创建一个合并两个数组的函数C ++

时间:2018-01-31 18:54:46

标签: c++ arrays merge

在我的主要功能中我有:

#include <iostream>
using namespace std;

int main() {
int merge(int a[], int b[]);

 int dim1, dim2;


cin >> dim1 >> dim2;
 int arrc[dim1];
 int arrd[dim2];

我用我的数组填充:

    for(int i = 0; i < dim1; i++){
        cin >> arrc[i];
    }

    for(int i = 0; i < dim2; i++){
        cin >> arrd[i];
    }

出于主要功能,我有:

int merge(int a[], int b[]){
    int q;
    int arrf[q];
 //Code here
}

如何使我的int q成为dim1和dim2的总和? 我试图将merge函数声明为:

 int merge(int a[something], int b[something2]);

但我有错误......

2 个答案:

答案 0 :(得分:4)

代码

int arrc[dim1];
int arrd[dim2];

无效的C ++。 C ++没有可变长度数组,因此要使其工作,dim1dim2必须是编译时常量。相反,你将不得不使用动态分配的数组,或者更好的是,std::vector(它基本上只是一个动态分配的数组的包装器,可以重新分配以允许数组增长):

std::vector<int> arrc(dim1);
std::vector<int> arrd(dim2);

同样,您可以将merge函数的签名更改为:

std::vector<int> merge(const std::vector<int>& a, const std::vector<int>& b)
{
    std::vector<int> ret;
    for (int i : a)
    {
        ret.push_back(i);
    }
    for (int i : b)
    {
        ret.push_back(i);
    }
    return ret;
}

您实际上并不需要实现自己的merge功能。 C ++标准库已经提供了std::merge,您希望如此:

std::vector<int> arrc(dim1);
std::vector<int> arrd(dim2);
// Fill arrc and arrd somehow

std::vector<int> merged;
std::merge(arrc.begin(), arrc.end(),
           arrd.begin(), arrd.end(),
           std::back_inserter(merged));

答案 1 :(得分:0)

C风格的数组不能直接从函数返回,当它们按值传递给函数时,它们会隐式转换为指针,从而丢失它们的大小信息。

要保留C样式数组的大小信息,可以通过模板函数引用它,如下所示:

#include <cstddef>

template<std::size_t N>
int &last_element(int(&a)[N])
{
    return a[N - 1];
}

虽然无法直接从函数返回C样式数组,但标准库中的std::array可以。

#include <array>

std::array<int, 3> get_array()
{
    return {};
}

将两者放在一起,你可以做类似

的事情
#include <algorithm>
#include <array>
#include <cstddef>

namespace detail {

template<std::size_t N1, std::size_t N2>
inline auto join_(const int a1[], const int a2[]) noexcept
{
    std::array<int, N1 + N2> joined;

    std::copy_n(a1, N1, joined.begin());
    std::copy_n(a2, N2, joined.begin() + N1);

    return joined;
}

}//detail

// std::array overload
template<std::size_t N1, std::size_t N2>
auto join(const std::array<int, N1> &a1, const std::array<int, N2> &a2) noexcept
{
    return detail::join_<N1, N2>(a1.data(), a2.data());
}

// C-style array overload
template<std::size_t N1, std::size_t N2>
auto join(const int(&a1)[N1], const int(&a2)[N2]) noexcept
{
    return detail::join_<N1, N2>(a1, a2);
}