我正在尝试使用插入排序对字符串向量进行排序。
这是我的代码:
void insertionsort(std::vector<std::string> &strings)
{
typedef std::vector<std::string>::size_type size_type;
for(size_type i = 0;i < strings.size(); i++)
{
std::string const tmp = strings[i];
size_type j = i - 1;
while(j >= 0 && tmp < strings[j]) //this is the problem
{
strings[j + 1]= strings[j];
j--;
}
strings[j + 1]=tmp;
}
}
它给了我错误:
无符号表达式的比较&gt; = 0始终为真
如果我使用j&gt;该功能正常工作但它完全忽略了字符串的第一行。
例如我有:
2 line1
3 line2
4 line3
5 line4
1 line5
然后它给了我:
2 line1
1 line5
3 line2
4 line3
5 line4
答案 0 :(得分:3)
vector<T>::size_type
by definition未签名,因此j >= 0
不能为假。您应该使用vector<T>::difference_type
。
答案 1 :(得分:1)
类模板size_type
的类型别名std::vector
始终为非负整数类型。所以表现
j >= 0
总是如此。
您需要在功能实现中进行一些小的更改。很明显,总是对包含一个元素的向量进行排序。因此,您应该以索引等于1开始外部循环。
你在这里
#include <iostream>
#include <vector>
#include <string>
void insertionSort( std::vector<std::string> &strings )
{
typedef std::vector<std::string>::size_type size_type;
for ( size_type i = 1; i < strings.size(); ++i )
{
std::string tmp = strings[i];
size_type j = i;
for ( ; j != 0 && tmp < strings[j-1]; --j )
{
strings[j] = strings[j-1];
}
if ( j != i ) strings[j] = tmp;
}
}
int main()
{
std::vector<std::string> v = { "E", "D", "C", "B", "A" };
for ( const auto &s : v ) std::cout << s << ' ';
std::cout << std::endl;
insertionSort( v );
for ( const auto &s : v ) std::cout << s << ' ';
std::cout << std::endl;
}
程序输出
E D C B A
A B C D E
注意这个附加声明
if ( j != i ) strings[j] = tmp;
如果一个元素已经占据了向量中的所需位置,那么将其分配给自身是没有意义的。这使得该功能更有效。
将difference_type
类型与成员函数size_type
的返回类型size()
混合使用是个坏主意。