我想知道有什么方法可以避免在功能中提到数组的大小。下面是我的简单代码。每次我在main中创建一个数组时我都要改变函数passbyref的引用数组的大小。 非常感谢。
#include<iostream>
#include<string>
#include<iomanip>
#include<array>
using namespace std;
class GradeBook {
public:
void changevalues()
{
cout<<arr2[2]<<endl;
arr2[2]=2;
cout<<arr2[2]<<endl;
}
void passbyref(array<int,5>& refvar) //here 5 I have to mention myself
{
refvar[2]=2;
}
private:
array <int,5> arr2;
};
int main() {
array <int,5> grades1{1,1,1,1,1};
GradeBook obj1;
cout<<"grades[2] before change =" <<grades1[2]<<endl;
obj1.passbyref(grades1);
cout<<"grades[2] after change =" <<grades1[2];
}
答案 0 :(得分:2)
可以在passbyref
函数中将数组大小指定为模板参数。
template <std::size_t N>
void passbyref(array<int,N>& refvar) {
}
N
的值将自动扣除,因此无需在调用者中指定该值。这样,如果您更改main
中的尺寸,passbyref
中就不需要进行任何更改。
答案 1 :(得分:0)
使用动态数组可能更好 - 一个长度可以在运行时更改的动态数组。使用动态数组的最简单方法是使用在内部管理数组的std::vector。
void passbyref(std::vector<int>& refvar) // no need to mention size
{
if(refvar.size() > 2)
refvar[2] = 2;
}
// ...
int main() {
std::vector<int> grades1 {1, 1, 1, 1, 1}; // any length you want
passbyref(grades1);
}
答案 2 :(得分:0)
std::array
的想法是大小是特定数组的一个组成部分,因为它是类型,这使得它比c风格的数组更清晰,但它意味着在函数中,预期的大小必须在场。
可能的解决方案:
std::array
是正确的容器吗?typedef std::array<int,5> MySpecificArray
std::vector
答案 3 :(得分:0)
模板是你的朋友。下面的函数适用于任何可以使用方括号索引的数组类型,并且其值类型可以转换为int。
#include<iostream>
#include<string>
#include<iomanip>
#include<array>
using namespace std;
class GradeBook {
public:
void changevalues()
{
cout<<arr2[2]<<endl;
arr2[2]=2;
cout<<arr2[2]<<endl;
}
template<typename Arr>
void passbyref(Arr& refvar) //here 5 I have to mention myself
{
auto N = distance(begin(refvar), end(refvar));
cout << "size is " << N << '\n';
refvar[2]=2;
}
private:
array <int,5> arr2;
};
int main() {
array <int,5> grades1{1,1,1,1,1};
GradeBook obj1;
cout<<"grades[2] before change =" <<grades1[2]<<endl;
obj1.passbyref(grades1);
cout<<"grades[2] after change =" <<grades1[2];
return 0;
}
答案 4 :(得分:-1)
<rant: on>
这是C ++中的一个常见问题:没有办法声明一个大小恒定且仅在运行时已知的顺序容器。这是其中一个原因(与C兼容),而一些编译器特别是gcc和clang允许C ++中的可变长度数组作为编译器扩展。<rant: off>
。如果只使用几个大小并且是编译时表达式,则可以使用模板整数值作为大小(std::array<int, sz>
)。在任何其他情况下,您将不得不依赖std::vector
以符合C ++的方式。