什么是 CStringArray 或 CSortStringArray。以及如何按顺序排列这个数组?
What is CStringArray or CSortStringArray. And how to arrange this array in order?
问题是如果我只是使用CStringArray
而不是CSortStringArray
如何排列顺序第一个数组sortarray的排列是从(a到m)的顺序。但是如果我使用 CSortStringArray
仍然是相同的安排。第二个数组 sortarray1 从 1.txt 到 15.txt 使用 CStringArray
或 CSortStringArray
顺序总是错误的?
void CtestmfcDlg::OnBnClickedOk()
{
CSortStringArray sortArray;
sortArray.Add(CString("a"));
sortArray.Add(CString("b"));
sortArray.Add(CString("c"));
sortArray.Add(CString("d"));
sortArray.Add(CString("e"));
sortArray.Add(CString("f"));
sortArray.Add(CString("g"));
sortArray.Add(CString("h"));
sortArray.Add(CString("i"));
sortArray.Add(CString("j"));
sortArray.Add(CString("k"));
sortArray.Add(CString("l"));
sortArray.Add(CString("m"));
CSortStringArray sortArray1;
sortArray1.Add(CString("1.txt"));
sortArray1.Add(CString("2.txt"));
sortArray1.Add(CString("3.txt"));
sortArray1.Add(CString("4.txt"));
sortArray1.Add(CString("5.txt"));
sortArray1.Add(CString("6.txt"));
sortArray1.Add(CString("7.txt"));
sortArray1.Add(CString("8.txt"));
sortArray1.Add(CString("9.txt"));
sortArray1.Add(CString("10.txt"));
sortArray1.Add(CString("11.txt"));
sortArray1.Add(CString("12.txt"));
sortArray1.Add(CString("13.txt"));
sortArray1.Add(CString("14.txt"));
sortArray1.Add(CString("15.txt"));
for (int i = 0; i <= sortArray.GetUpperBound(); i++)
{
testbox1.AddString(sortArray[i]);
}
//sortArray.Sort();
for (int j = 0; j <= sortArray1.GetUpperBound(); j++)
{
testbox2.AddString(sortArray1[j]);
}
}
您不能指望字符串排序算法对整数进行排序。
文件名 10.txt
将 return 在位置 [0] 与 2.txt
相比较小(见 ascii 代码 49 < 50)。
如果要按整数而不是字符串排序,则必须实现自己的排序算法。
//要删除文件的最后一个扩展名,你可以使用这个:
std::string RemoveLastExtension(const std::string &fileName)
{
auto pos = fileName.rfind(".");
if (pos == std::string::npos)
pos = -1;
return std::string(fileName.begin(), fileName.begin() + pos);
}
如果最低系统要求是 Vista 或更高,那么您可以使用 CompareStringEx
。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include "windows.h"
using namespace std;
int wmain()
{
vector<wstring> sa;
wchar_t temp[50];
for (int i = 12; i > 0; i--)
{
wsprintf(temp, L"%d.txt", i);
sa.push_back(temp);
}
struct {
bool operator()(const wstring &a, const wstring &b) {
return CompareStringEx(0, SORT_DIGITSASNUMBERS,
a.c_str(), a.length(), b.c_str(), b.length(), 0, 0, 0) == CSTR_LESS_THAN;
}
} mysort;
sort(sa.begin(), sa.end(), mysort);
for (size_t i = 0, count = sa.size(); i < count; i++)
wcout << sa[i] << endl;
return 0;
}
输出:
1.txt
2.txt
3.txt
...
9.txt
10.txt
11.txt
12.txt
问题是如果我只是使用CStringArray
而不是CSortStringArray
如何排列顺序第一个数组sortarray的排列是从(a到m)的顺序。但是如果我使用 CSortStringArray
仍然是相同的安排。第二个数组 sortarray1 从 1.txt 到 15.txt 使用 CStringArray
或 CSortStringArray
顺序总是错误的?
void CtestmfcDlg::OnBnClickedOk()
{
CSortStringArray sortArray;
sortArray.Add(CString("a"));
sortArray.Add(CString("b"));
sortArray.Add(CString("c"));
sortArray.Add(CString("d"));
sortArray.Add(CString("e"));
sortArray.Add(CString("f"));
sortArray.Add(CString("g"));
sortArray.Add(CString("h"));
sortArray.Add(CString("i"));
sortArray.Add(CString("j"));
sortArray.Add(CString("k"));
sortArray.Add(CString("l"));
sortArray.Add(CString("m"));
CSortStringArray sortArray1;
sortArray1.Add(CString("1.txt"));
sortArray1.Add(CString("2.txt"));
sortArray1.Add(CString("3.txt"));
sortArray1.Add(CString("4.txt"));
sortArray1.Add(CString("5.txt"));
sortArray1.Add(CString("6.txt"));
sortArray1.Add(CString("7.txt"));
sortArray1.Add(CString("8.txt"));
sortArray1.Add(CString("9.txt"));
sortArray1.Add(CString("10.txt"));
sortArray1.Add(CString("11.txt"));
sortArray1.Add(CString("12.txt"));
sortArray1.Add(CString("13.txt"));
sortArray1.Add(CString("14.txt"));
sortArray1.Add(CString("15.txt"));
for (int i = 0; i <= sortArray.GetUpperBound(); i++)
{
testbox1.AddString(sortArray[i]);
}
//sortArray.Sort();
for (int j = 0; j <= sortArray1.GetUpperBound(); j++)
{
testbox2.AddString(sortArray1[j]);
}
}
您不能指望字符串排序算法对整数进行排序。
文件名 10.txt
将 return 在位置 [0] 与 2.txt
相比较小(见 ascii 代码 49 < 50)。
如果要按整数而不是字符串排序,则必须实现自己的排序算法。
//要删除文件的最后一个扩展名,你可以使用这个:
std::string RemoveLastExtension(const std::string &fileName)
{
auto pos = fileName.rfind(".");
if (pos == std::string::npos)
pos = -1;
return std::string(fileName.begin(), fileName.begin() + pos);
}
如果最低系统要求是 Vista 或更高,那么您可以使用 CompareStringEx
。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include "windows.h"
using namespace std;
int wmain()
{
vector<wstring> sa;
wchar_t temp[50];
for (int i = 12; i > 0; i--)
{
wsprintf(temp, L"%d.txt", i);
sa.push_back(temp);
}
struct {
bool operator()(const wstring &a, const wstring &b) {
return CompareStringEx(0, SORT_DIGITSASNUMBERS,
a.c_str(), a.length(), b.c_str(), b.length(), 0, 0, 0) == CSTR_LESS_THAN;
}
} mysort;
sort(sa.begin(), sa.end(), mysort);
for (size_t i = 0, count = sa.size(); i < count; i++)
wcout << sa[i] << endl;
return 0;
}
输出:
1.txt
2.txt
3.txt
...
9.txt
10.txt
11.txt
12.txt