如何从非类函数c ++编写类中函数?

问题描述

我有一个非类的合并功能

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。

vector<int> sorted_vector=merge_sort(my_vector);

但是,我想以这种方式致电main。

my_vector.merge_sort()

对于第二种调用,我教我需要一个不带Sorter类的参数和参数的成员函数。因此,我实现了如下的成员函数

Sorter.cpp

template<typename T>
void Sorter<T>::merge_sort(){

    vector<int> sorted_vector = merge_sort(my_vector_2);

}

我进行了研究,发现这与辅助功能有关,但我无法弄清楚。我的方法正确吗?

解决方法

所以我要吐口水。

  • 纯粹的函数-接受显式输入并返回显式输出-易于推理。

  • 懒惰,少做些事。

方法通常不纯;它们对附加的对象进行操作,并隐式获取并返回其整个状态。因此,如果该函数本身不是一团糟,请明智地尝试将其保留为纯函数。

另一方面,将功能附加到对象可以很好地完成代码;首先提到名词(对象),无脑代码完成代码可以使您的方法及其签名更加容易。同时,自由函数是一堆动词,代码完成工具很难使用它们。


接下来,此代码有一个小问题,您需要清理:

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){

或更妙的是,为span / left获得right个对象。


针对您的方法:

template<typename T>
void Sorter<T>::merge_sort();

现在,除了作为练习之外,拥有一个有状态对象(“ Sorter”)非常荒谬。

我认为它看起来像这样:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...