首先你需要決定是否一個字符串是一個數字或不是此使用strtol
一個功用:
#include <stdlib.h> // strtol
bool is_number(const std::string &str, long &num)
{
char *p;
num = strtol(str.c_str(), &p, 10);
return *p == '\0';
}
使用的部份函數在第二個函數中決定字符串a
是否小於字符串b
。
#include <tuple>
bool sortFunc(const std::string &a, const std::string &b)
{
long numA;
long numB;
bool is_a_num = is_number(a, numA);
bool is_b_num = is_number(b, numB);
return std::make_tuple(!is_a_num, numA, a) < std::make_tuple(!is_b_num, numB, b);
}
使用std::sort
排序的字符串的int std::vector
// include <algorithm> // sort
std::vector<std::string> numbers;
....
std::sort(numbers.begin(), numbers.end(), sortFunc);
的其他解決辦法是分裂的兩個vector
單獨vector
秒。一個字符串和一個數字和他們sperately排序:
std::vector<std::string> numbers;
....
std::vector<std::string> vStr;
std::vector<long> vNum;
for (std::string &str: numbers)
{
long num;
if (is_number(str, num)
vNum.push_back(num);
else
vStr.push_back(str);
}
std::sort(vNum.begin(), vNum.end());
std::sort(vStr.begin(), vStr.end());
,如果你想知道每個字符串或數字的原vector
位置使用std::map
。
#include <map>
std::vector<std::string> numbers;
....
std::map< std::string, size_t > mapStr; // map string to index of string in vector numbers
std::map< long, size_t > mapNum; // map number to index of number in vector numbers
for (size_t index = 0; index < numbers.size(); index ++)
{
long num;
if (is_number(numbers[index], num))
mapNum.emplace(num, index);
else
mapStr.emplace(numbers[index], index);
}
for (auto & pa : mapNum)
std::cout << pa.first << " pos " << pa.second << std::endl;
for (auto & pa : mapStr)
std::cout << pa.first.c_str() << " pos " << pa.second << std::endl;
當然你也可以使用一個std::map
具有comperator功能太:
std::vector<std::string> numbers;
....
std::map< std::string, size_t, bool(*)(const std::string &a, const std::string &b) > mapN(sortFunc);
for (size_t index = 0; index < numbers.size(); index ++)
mapN.emplace(numbers[index], index);
for (auto & pa : mapN)
std::cout << pa.first << " pos " << pa.second << std::endl;
您可以使用std::tuple
關鍵的std::map
太:
std::vector<std::string> numbers;
....
std::map< std::tuple< bool, long, std::string>, size_t > mapTupleN;
for (size_t index = 0; index < numbers.size(); index ++)
{
long num;
bool is_num = is_number(numbers[index], num);
mapTupleN.emplace(std::make_tuple(!is_num, num, numbers[index]), index);
}
for (auto & pa : mapTupleN)
{
if (!std::get<0>(pa.first))
std::cout << std::get<1>(pa.first) << " is number at position " << pa.second << std::endl;
else
std::cout << std::get<2>(pa.first).c_str() << " is string at position " << pa.second << std::endl;
}
請將樣本輸入,預期輸出和觀測輸出。 –
你可以分享樣本輸入輸出嗎?需要確定你正在嘗試做什麼。 –
'char * a = new char [numbers [i] .size()+ 1];'爲什麼? – PaulMcKenzie