在我的主要功能中我有:
#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]);
但我有错误......
答案 0 :(得分:4)
代码
int arrc[dim1];
int arrd[dim2];
无效的C ++。 C ++没有可变长度数组,因此要使其工作,dim1
和dim2
必须是编译时常量。相反,你将不得不使用动态分配的数组,或者更好的是,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);
}