如何从非 class 函数 c++ 编写 in-class 函数?
How to write in-class function from non-class function c++?
我有合并函数,它是非class。
Merge.cpp
template <typename T>
vector<T> merge(vector<T> left, vector<T> right){
vector<T> result;
int left_current = 0, right_current = 0;
while(left_current < left.size() && right_current < right.size()){
if(left[left_current] <= right[right_current]){
result.push_back(left[left_current]);
left_current++;
}else{
result.push_back(right[right_current]);
right_current++;
}
}
while(left_current < left.size()){
result.push_back(left[left_current]);
left_current++;
}
while(right_current < right.size()){
result.push_back(right[right_current]);
right_current++;
}
return result;
}
template <typename T>
vector<T> merge_sort(vector<T> arr){
vector<T> left, right, result;
if(arr.size() <= 1)
return arr;
int middle = arr.size() / 2;
for(int i=0;i<middle;i++){
left.push_back(arr[i]);
}
for(int i=middle;i<arr.size();i++){
right.push_back(arr[i]);
}
left = merge_sort(left);
right = merge_sort(right);
arr = merge(left,right);
return arr;
}
一般情况下,我是这样在main中调用merge的
vector<int> sorted_vector=merge_sort(my_vector);
但是,我想这样调用main。
my_vector.merge_sort()
为了以第二种方式调用,我教我需要一个成员函数,它不带参数和 Sorter 的参数 class。所以,我实现了我的成员函数,如下所示。
Sorter.cpp
template<typename T>
void Sorter<T>::merge_sort(){
vector<int> sorted_vector = merge_sort(my_vector_2);
}
我进行了研究,发现这是关于辅助函数的,但我想不通out.Is我的方法是正确的吗?
所以我要讲一些陈词滥调。
纯函数——采用显式输入和 return 显式输出——更容易推理。
偷懒,少做事。
一般来说,方法是不纯的;它们对它们所依附的对象进行操作,隐含地获取并 returning 其整个状态。因此,如果函数本身不是一团糟,state-wise,请尽量将其保持为纯函数。
另一方面,为了 code-completion 的目的,将函数附加到对象是很好的;通过首先提及名词(对象),无脑 code-completion 代码可以更容易地找到您的方法及其签名。同时,自由函数是一大堆动词,code-completion 工具更难处理。
接下来,此代码有一个小问题需要您解决:
template <typename T>
vector<T> merge(vector<T> left, vector<T> right){
调整为:
template <typename T>
vector<T> merge(vector<T> const& left, vector<T> const& right){
甚至更好,为 left
/right
.
获取 span
个对象
对于你的方法:
template<typename T>
void Sorter<T>::merge_sort();
现在,除了作为练习之外,拥有一个作为“分类器”的有状态对象是非常荒谬的。
我假设它看起来像这样:
template<typename T>
class Sorter {
public:
std::vector<T> m_data;
void merge_sort();
};
(m_
部分只是提醒这是会员)。
在这种情况下,您可以这样写 merge_sort
:
template<typename T>
void Sorter::merge_sort() {
m_data = ::merge_sort(m_data);
}
完成。
(如果 merge_sort
在命名空间中,比如 my_code
,将 ::
替换为 my_code::
)。
烦人的是 merge_sort
方法和 merge_sort
函数同名。默认情况下,由于名称查找规则,成员会阻止查找函数。 ::
或 my_code::
告诉编译器你在谈论哪个 merge_sort
。
我有合并函数,它是非class。
Merge.cpp
template <typename T>
vector<T> merge(vector<T> left, vector<T> right){
vector<T> result;
int left_current = 0, right_current = 0;
while(left_current < left.size() && right_current < right.size()){
if(left[left_current] <= right[right_current]){
result.push_back(left[left_current]);
left_current++;
}else{
result.push_back(right[right_current]);
right_current++;
}
}
while(left_current < left.size()){
result.push_back(left[left_current]);
left_current++;
}
while(right_current < right.size()){
result.push_back(right[right_current]);
right_current++;
}
return result;
}
template <typename T>
vector<T> merge_sort(vector<T> arr){
vector<T> left, right, result;
if(arr.size() <= 1)
return arr;
int middle = arr.size() / 2;
for(int i=0;i<middle;i++){
left.push_back(arr[i]);
}
for(int i=middle;i<arr.size();i++){
right.push_back(arr[i]);
}
left = merge_sort(left);
right = merge_sort(right);
arr = merge(left,right);
return arr;
}
一般情况下,我是这样在main中调用merge的
vector<int> sorted_vector=merge_sort(my_vector);
但是,我想这样调用main。
my_vector.merge_sort()
为了以第二种方式调用,我教我需要一个成员函数,它不带参数和 Sorter 的参数 class。所以,我实现了我的成员函数,如下所示。
Sorter.cpp
template<typename T>
void Sorter<T>::merge_sort(){
vector<int> sorted_vector = merge_sort(my_vector_2);
}
我进行了研究,发现这是关于辅助函数的,但我想不通out.Is我的方法是正确的吗?
所以我要讲一些陈词滥调。
纯函数——采用显式输入和 return 显式输出——更容易推理。
偷懒,少做事。
一般来说,方法是不纯的;它们对它们所依附的对象进行操作,隐含地获取并 returning 其整个状态。因此,如果函数本身不是一团糟,state-wise,请尽量将其保持为纯函数。
另一方面,为了 code-completion 的目的,将函数附加到对象是很好的;通过首先提及名词(对象),无脑 code-completion 代码可以更容易地找到您的方法及其签名。同时,自由函数是一大堆动词,code-completion 工具更难处理。
接下来,此代码有一个小问题需要您解决:
template <typename T>
vector<T> merge(vector<T> left, vector<T> right){
调整为:
template <typename T>
vector<T> merge(vector<T> const& left, vector<T> const& right){
甚至更好,为 left
/right
.
span
个对象
对于你的方法:
template<typename T>
void Sorter<T>::merge_sort();
现在,除了作为练习之外,拥有一个作为“分类器”的有状态对象是非常荒谬的。
我假设它看起来像这样:
template<typename T>
class Sorter {
public:
std::vector<T> m_data;
void merge_sort();
};
(m_
部分只是提醒这是会员)。
在这种情况下,您可以这样写 merge_sort
:
template<typename T>
void Sorter::merge_sort() {
m_data = ::merge_sort(m_data);
}
完成。
(如果 merge_sort
在命名空间中,比如 my_code
,将 ::
替换为 my_code::
)。
烦人的是 merge_sort
方法和 merge_sort
函数同名。默认情况下,由于名称查找规则,成员会阻止查找函数。 ::
或 my_code::
告诉编译器你在谈论哪个 merge_sort
。