如何在向量中对字符串进行排序?

时间:2014-05-07 22:41:10

标签: c++ sorting vector

我有一个程序,它使用我制作的名为" SortableVector,"与父母名为SimpleVector。简单向量很好,SortableVector也是如此,但问题是SortableVector中的sort函数。它对数字排序很好,但我无法对它进行排序。这就是我原来拥有的东西:

template <class T>
void SortableVector<T>::sort()
{
   T temp = 0;
   for(int i = 0; i < this->size(); i++)
   {
      for (int count = i+1; count < this->size(); count++)
      {
          if(this->operator[](0) == int)
          {
             if (this->operator[](count) < this->operator[](i))
             {
                temp = this->operator[](count);
                this->operator[](count) = this->operator[](i);
                this->operator[](i) = temp;
                count = i+1;
             }
          }
      }
   }

}

然后我尝试使用sort(开始,结束)功能,但这也不起作用:

template <class T>
void SortableVector<T>::sort()
{
    sort(this->operator[].begin(), this->operator[].end();
}

编辑:为了帮助人们了解问题,请查看整个文件:

#ifndef SORTABLEVECTOR_H
#define SORTABLEVECTOR_H

using namespace std;
#include "SimpleVector.h"
#include <algorithm>
#include <fstream>
#include <string>

template <class T>
class SortableVector : public SimpleVector<T>
{
public:
SortableVector(int s) : SimpleVector<T>(s)
{}

SortableVector(SortableVector &);

SortableVector(SimpleVector<T> &obj):
        SimpleVector<T>(obj)
{}
void sort();
};

 template <class T>
SortableVector<T>::SortableVector(SortableVector &obj):SimpleVector<T>(obj)
{
}

template <class T>
void SortableVector<T>::sort()
{
std::sort(this->operator[].begin(), this->operator[].end());

T temp = 0;
    for(int i = 0; i < this->size(); i++)
    {
        for (int count = i+1; count < this->size(); count++)
        {
            if(this->operator[](0) == int)
            {
                if (this->operator[](count) < this->operator[](i))
                {
                    temp = this->operator[](count);
                    this->operator[](count) = this->operator[](i);
                    this->operator[](i) = temp;
                    count = i+1;
                }
            }
        }
    }

}

#endif

这是SimpleVector:

// SimpleVector.h

#ifndef SIMPLEVECTOR_H
#define SIMPLEVECTOR_H

#include <iostream>
#include <cstdlib>
using namespace std;

template <class T>
class SimpleVector
{
private:
T *aptr;
int arraySize;  
void subError();                          // Handles subscripts out of range
public:
SimpleVector()                            // Default constructor
   { aptr = 0; arraySize = 0;}
SimpleVector(int);                        // Constructor
SimpleVector(const SimpleVector &);       // Copy constructor
~SimpleVector();                          // Destructor
int size() { return arraySize; }
T &operator[](int);                       // Overloaded [] operator
void print() const;                       // outputs the array elements

void push_back(T);                        // newly added function (implemention needed)
T pop_back();                             // newly added function (implemention needed)
};

//****************************************************************
//          Constructor for SimpleVector class                   *
// Sets the size of the array and allocates memory for it.       *
//****************************************************************
template <class T>
SimpleVector<T>::SimpleVector(int s)
{
arraySize = s;
aptr = new T [s];
}

//*********************************************
// Copy Constructor for SimpleVector class    *
//*********************************************
template <class T>
SimpleVector<T>::SimpleVector(const SimpleVector &obj)
{
arraySize = obj.arraySize;
aptr = new T [arraySize];
for(int count = 0; count < arraySize; count++)
    *(aptr + count) = *(obj.aptr + count);
}

// *************************************
// Destructor for SimpleVector class   *
// *************************************
template <class T>
SimpleVector<T>::~SimpleVector()
{
if (arraySize > 0)
    delete [] aptr;
}

//************************************************************
//               SubError function                           *
// Displays an error message and terminates the program when * 
// a subscript is out of range.                              *
//************************************************************
template <class T>
void SimpleVector<T>::subError()
{
cout << "ERROR: Subscript out of range.\n";
exit(0);
}

//***********************************************************
//             Overloaded [] operator                       *
// This function returns a reference to the element         *
// in the array indexed by the subscript.                   *
//***********************************************************
template <class T>
T &SimpleVector<T>::operator[](int sub)
{
if (sub < 0 || sub >= arraySize)
    subError();
return aptr[sub];
}

//********************************************************
// prints all the entries is the array.                  *
//********************************************************
template <class T>
void SimpleVector<T>::print( ) const
{
for (int k = 0; k < arraySize; k++ )
  cout << aptr[k] << "  ";
cout << endl;  
}

//***************************************************************
//                   (1) push_back(T val)                       *
// The push_back function pushes its argument onto the back     *
// Of the vector.                                               *                                      
//***************************************************************

template <class T>
void SimpleVector<T>::push_back(T val)
{
aptr[arraySize] = val;
arraySize++;
}

// *****************************************************
//                (2) pop_back()                       *
// The pop_back function removes the last element      *
// Of the vector. It also returns that value.          *
// *****************************************************

template <class T>
T SimpleVector<T>::pop_back()
{
arraySize--;
T temp = aptr[arraySize];
return temp;
}





#endif

SimpleVector由讲师提供。

2 个答案:

答案 0 :(得分:1)

  • 99%的时间你可以不重复this->

  • 您只需调用运算符,而不是将它们作为函数调用

  • 您可以使用std::sort

  • 中的<algorithm>

想象一下你没有展示的一些代码:

#include <vector>
#include <algorithm>

template <typename T>
struct SimpleVector {
    std::vector<T> data;

    virtual ~SimpleVector() {}
};


template <typename T>
struct SortableVector : public SimpleVector<T> {
    void sort() {
        std::sort(this->data.begin(), this->data.end());
    }
};

#include <iostream>

int main()
{
    SortableVector<std::string> sv;
    sv.data = {"one","two","three","four"};

    sv.sort();
    for(auto& s : sv.data)
        std::cout << s << ' ';
}

免责声明这似乎是设计类的非c ++方式。传统上算法和容器是分开的,这是有充分理由的。例外情况是成员函数有时以更优化的方式执行操作(例如std::set<>::find而不是std::find

答案 1 :(得分:0)

应该是std::sort(aptr, aptr + arraySize);。如果您打算捕获这样的错误而不是有未定义的行为,那么在执行此操作之前,您应该检查arraySize > 0

beginend不是魔法;它们依赖于对象要么是数组(不是指针),要么是实现返回迭代器的函数.begin().end()的对象。

您甚至可以自己定义这些功能,例如SimpleVector<T>::begin() { return aptr; }等,但也许这不是一个好主意,因为它绕过你的边界检查。你必须实际编写一个迭代器类而不是返回一个指针,这比你准备好的麻烦更多:)

NB。在你写this->operator[](foo)的任何地方,写(*this)[foo]

会更清楚