不明白为什么设计的一个排序无法将string类数据进行排序

#include
#include
题目是输入几个字符串(包含大写字母、数字、—,),按照题目给定的对应规律把字符串中的特定字符变为对应数字,形成号码(转换后的号码长度为7),然后按顺序输出号码以及对应的出现次数。。。
using namespace std;
class tel
{
public:
int num;
string ori;string *alt;
tel(int n);
tel sort();
void print();
friend char search (char);
};
void tel::print()
{略}
tel tel::sort()
{
string *begin = alt, *end = alt+num;
if(num== 1) return *this;
const char
p=alt->c_str();//测试行
cout<<p<<endl;

//这里可以显示正确alt中的字符串
for(string* i = begin; i != end; i++)
    for(string* j = i; j != begin; j--)
        if( *(j-1) > *j )
        {
            string temp(*(j-1));
            *(j-1) = *j;
            *j = temp;
        }
const char* q=alt->c_str();//测试行
cout<<q<<endl;//测试行输出结果和上面一样。。为什么没有发生交换?
return *this;

}
char search (char a)
{
实现问题无关功能,略
}
tel::tel(int n)//题目是输入几个字符串(包含大写字母、数字、—,),按照题目给定的对应规律把字符串中的特定字符变为对应数字,形成号码(转换后的号码长度为7)
{
num=n;
ori=new string [num];
alt=new string [num];
for (int i=0; i!=num;i++)
{
cin>>ori[i];
int k=0;
int len=(int)strlen(ori[i].c_str());
for (int j=0;j!=len;j++)
{

        if(ori[i][j]>=65&&ori[i][j]<=90)
        { alt[i][k]=search(ori[i][j]);k++;}
        else if(ori[i][j]>=48&&ori[i][j]<=57)
        {
            alt[i][k]=ori[i][j];k++;
        }
        else continue;
    }

}

}

int main()
{
int num;
cin>>num;
tel directory(num);
directory.sort().print();

return 0;

}

明白为什么设计的一个排序无法将string类数据进行排序
如注释所写问题。。
#include
#include
题目是输入几个字符串(包含大写字母、数字、—,),按照题目给定的对应规律把字符串中的特定字符变为对应数字,形成号码(转换后的号码长度为7),然后按顺序输出号码以及对应的出现次数。。。
using namespace std;
class tel
{
public:
int num;
string ori;string *alt;
tel(int n);
tel sort();
void print();
friend char search (char);
};
void tel::print()
{略}
tel tel::sort()
{