如何从非 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