问题描述
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
。