输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <sstream> //for stringstream
using namespace std;
//static bool compare(const string s1,const string s2){
static bool compare(const string &s1,const string &s2){ //见下文
string st1=s1+s2;
string st2 = s2+s1;
return st1<st2;
}
string PrintMinNumber(vector<int> numbers) {
string snum;
if(numbers.empty())
return snum;
vector<string> vnum;
for(int i=0;i<numbers.size();i++)
{
stringstream ss; //注意这种用法
string s;
ss<<numbers[i];
ss>>s;
vnum.push_back(s);
}
sort(vnum.begin(),vnum.end(),compare);
for(int i=0;i<numbers.size();i++)
snum.append(vnum[i]);
return snum;
}
int main(void)
{
int a[5]={2,3,1,4,5};
vector<int> aa(a,a+5);
string ss;
ss=PrintMinNumber(aa);
cout<<ss<<endl;
system("pause");
return 0;
}
//比较两个数,如果相同返回0,如果v1大,返回1,如果v2大,返回-1
int compare(const int &v1, const int &v2)
{
if(v1 < v2) return -1;
if(v2 < v1) return 1;
return 0;
}
上面这例子中的const还有什么作用呢?原来使用const可以避免引用复制,提高性能,swapOne中当然不能使用了,因为它要改变值,而compare函数只是比较两个数的大小,没有交换,所以加上const可以提高性能。因为复制对象需要付出时间和存储空间代价。
后记:最近无意中看到了《Effective C++》的条款20“宁以pass-by-reference-to-const 替换 pass-by-value”。中也谈到了这个问题。
class Person{
public:
Person();
virtual ~Person();
...
private:
std::string name;
std::string address;
};
class Student:public Person{
public:
Student();
~Student();
...
private:
std::string schoolName;
std::string schoolAddress;
}
假设现在有这样一个函数
bool validateStudent(Student s);
如果用by Value方式来调用就是
Student plato;
bool platoIsOk = validateStudent(plato);
因为Student类是继承Person类,每个类都有两个string。书上说,by value方式传递一个Student对象,总体成本是"六次构造函数和六次析构函数"!
如果改成成pass by reference-to-const:
bool validateStudent(const Student& s);没有任何构造函数或析构函数被调用,因为没有任何新对象被创建。