如何使用 (<,>) 比较字符串
How to compare strings using (<,>)
我正在尝试为我的while循环比较两个字符串,这是我的代码片段:
//variables
string pivot, array[10];
int rightBoundary;
//loop
while( pivot < array[rightBoundary])
此代码来自有关快速排序的教程,但我试图将其转换为处理字符串。
所以我的问题是做这种比较的最佳方法是什么。
目前我收到此错误(在快速排序编号.exe 0x774215de未处理的异常:0xC0000005:访问违规读取位置0x965b7214。
帮助将是伟大的感谢:)
编辑:抱歉应该刚刚上传了我的所有代码,我认为问题实际上可能是字符串数组。 这是我的所有代码:
#include <iostream>
#include <string>
using namespace std;
#define array1_SIZE 5 //change the array1 size here
void Printarray1(string* array1, int n);
void QuickSort(string* array1, int startIndex, int endIndex);
int Splitarray1(string* array1, string pivot, int startIndex, int endIndex);
void swap(string &a, string &b);
int main(void)
{
string array1[array1_SIZE];
int i;
for( i = 0; i < array1_SIZE; i++) //array1 elements input
{
cout<<"Enter an integer : ";
cin>>array1[i];
}
cout<<endl<<"The list you input is : "<<endl;
Printarray1(array1, array1_SIZE);
QuickSort(array1,0,array1_SIZE - 1); //sort array1 from first to last element
cout<<endl<<"The list has been sorted, now it is : "<<endl;
Printarray1(array1, array1_SIZE);
cin.get();
cin.get();
int read;
cin >> read;
return 0;
}
/* This function swaps two numbers
Arguments :
a, b - the numbers to be swapped
*/
void swap(string &a, string &b)
{
string temp;
temp = a;
a = b;
b = temp;
}
/* This function prints an array1.
Arguments :
array1 - the array1 to be printed
n - number of elements in the array1
*/
void Printarray1(string* array1, int n)
{
int i;
for( i = 0; i < n; i++)
{
cout << array1[i] << 't';
}
}
/* This function does the quicksort
Arguments :
array1 - the array1 to be sorted
startIndex - index of the first element of the section
endIndex - index of the last element of the section
*/
void QuickSort(string* array1, int startIndex, int endIndex)
{
string pivot = array1[startIndex]; //pivot element is the leftmost element
int splitPoint;
if(endIndex > startIndex) //if they are equal, it means there is
//only one element and quicksort's job
//here is finished
{
splitPoint = Splitarray1(array1, pivot, startIndex, endIndex);
//Splitarray1() returns the position where
//pivot belongs to
array1[splitPoint] = pivot;
QuickSort(array1, startIndex, splitPoint-1); //Quick sort first half
QuickSort(array1, splitPoint+1, endIndex); //Quick sort second half
}
}
/* This function splits the array1 around the pivot
Arguments :
array1 - the array1 to be split
pivot - pivot element whose position will be returned
startIndex - index of the first element of the section
endIndex - index of the last element of the section
Returns :
the position of the pivot
*/
int Splitarray1(string* array1, string pivot, int startIndex, int endIndex)
{
int leftBoundary = startIndex;
int rightBoundary = endIndex;
while(leftBoundary < rightBoundary) //shuttle pivot until the boundaries meet
{
while( pivot < array1[rightBoundary]//keep moving until a lesser element is found
&& rightBoundary > leftBoundary) //or until the leftBoundary is reached
{
rightBoundary--; //move left
}
swap(array1[leftBoundary], array1[rightBoundary]);
//Printarray1(array1, array1_SIZE); //Uncomment this line for study
while( pivot >= array1[leftBoundary] //keep moving until a greater or equal element is found
&& leftBoundary < rightBoundary) //or until the rightBoundary is reached
{
leftBoundary++; //move right
}
swap(array1[rightBoundary], array1[leftBoundary]);
//Printarray1(array1, array1_SIZE); //Uncomment this line for study
}
return leftBoundary; //leftBoundary is the split point because
//the above while loop exits only when
//leftBoundary and rightBoundary are equal
}
您可能遇到越界错误,可能是由于未初始化rightBoundary
。字符串可以用比较运算符完美地进行比较。
#include <iostream>
using std::cout;
#include <string>
using std::string;
int main()
{
string s1 = "hello";
string s2 = "world!";
string lower = s1 < s2 ? s1 : s2;
cout << lower; //prints "hello"
}
要在不担心大小写的情况下进行比较,您可以将lexicographical_compare
与您自己的比较器函数一起使用:
#include <algorithm>
using std::lexicographical_compare;
#include <cctype>
using std::tolower;
#include <iostream>
using std::cout;
#include <string>
using std::string;
bool nocase_compare (char one, char two)
{
return tolower (one) < tolower (two);
}
int main()
{
string s1 = "Hello";
string s2 = "happy";
if (lexicographical_compare (s1.begin(), s1.end(), s2.begin(), s2.end(), nocase_compare))
cout << s1;
else
cout << s2;
//prints "happy" even though 'H' < 'h'
}
如果你真的想使用<和>,你必须为string
制作一个小包装器来实现你的operator<
和operator>
版本。string
中实现的那些使用默认lexicographical_compare
。和>
使用
代码崩溃的原因是因为你没有给 rightBoundary 分配任何初始值,你应该这样做:
int rightBoundary = 0;
因为否则 rightBoundary 将有一个任意的初始值,该值将绝大多数大于"数组"的大小并导致越界访问。
相关文章:
- 视觉C++使用 map 来比较字符串中的每个单词
- 我正在尝试从输入文件中读取,然后使用它们的子字符串比较字符串的特定部分
- 比较字符串的 GetLine 工作一次,然后比较之后不起作用
- C++使用关系运算符比较字符串
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- C++ TCP 服务器比较字符串失败
- 如何在不复制的情况下比较字符串的一部分?
- 比较 C++ 字符串打印中的两个整数数组
- 如何比较字符串形式的临时变量
- std::out_of_range 比较字符串中的符号时出错
- 比较字符串大小写不区分的简单方法是什么?
- 比较字符串忽略 NUL
- 比较字符串(arduino)时出现问题
- 如何在C++中比较字符串
- 比较字符串对象等于向量中的元素
- C 比较字符串操作速度
- 需要比较字符串的某些元素
- 比较字符串 .c_str() 和普通字符串的差异
- C 比较字符串的字符
- 通过使用两个不同的队列比较字符串