2014-04-30 3 views
0

그래서 숫자 순서로 문자열 벡터를 정렬해야합니다. sortfunction을 사용하고 있으며 거의 ​​작동합니다. 문자열로 변환 된 숫자 10, 20, 5, 200, 50, 75이 있다고 가정 해보십시오. sort 함수는 다음과 같이 정렬합니다. 10, 200, 25, 5, 50, 75. 그래서 내가 생각하는 첫 번째 문자 만 정렬합니까? 쉽게 첫 번째 문자 이상을 정렬하는 방법이 있습니까? 그리고 네, 그들은 내 용도에 맞게 문자열로 변환되어야합니다.문자열로 변환 된 int의 벡터 정렬

감사합니다.

+3

정렬 알고리즘의 성능이 얼마나 중요합니까? 쉬운 대답은'boost :: lexical_cast'와 같은 것을 사용하여 기본 정수 값을 정렬하는 것입니다. – Chad

+0

아마도 문자열 비교를하고있을 것입니다. 여전히 int의 벡터 인 동안 정렬 할 수 있습니까? – Ben

+0

@Chad별로 중요하지 않습니다. 이것은 아주 작은 벡터입니다. 최대 20 개의 요소를 보유 할 수 있습니다. – Gundown64

답변

3

은 다음 코드 조각을 봐 :

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 

int main() 
{ 
    std::vector<std::string> v {"123", "453", "78", "333"}; 
    std::sort(std::begin(v), std::end(v), [] (std::string const &A, std::string const &B) { return std::stoi(A) < std::stoi(B);}); 

    for(auto i : v) std::cout << i << std::endl; 
} 
+0

'string'에서'int'로'O (N log N)'변환을 지불하고 있습니다 ... –

2

당신이 문자열의 벡터가되었다가 아니라 그 전에 후이를 정렬 할 왜 질문은 정말이다.

int를 포함하는 문자열의 벡터를 정렬하는 가장 간단한 방법은 정수로 변환하고 정렬 한 다음 다시 첫 번째 벡터로 문자열로 변환하는 것일 수 있습니다. 그렇지 않은 경우보다 효율적일 수 있습니다. 처음부터 문자열로 변환하십시오.

비교기 내에서 즉석에서 int으로 변환하라는 제안과 관련하여 비용이 많이 듭니다. int을 비교하는 것은 string에서 int으로의 변환 프로세스와 비교하면 사소합니다. 정렬 방식은 O(N log N) (예상)입니다. 전환 수를 O(N log N) 회 전환하면 즉시 전환 할 경우 O(N) 번으로 전환하고 O(N log N) 번만 int 번으로 비교하면됩니다.

알고리즘을 수공예로 만들어 비교할 수도 있습니다. 모든 값이 양수이고 선행 0이 없다고 가정하면 문자열로 표시된 숫자는 길이가 더 짧은 문자열로 표시된 다른 숫자보다 큽니다. 당신은 comparisson 기능을 구축하는 것을 사용할 수 : 0을 선도가있을 경우

struct Compare { 
    bool operator()(std::string const & lhs, std::string const & rhs) const { 
     return lhs.size() < rhs.size() 
      || (lhs.size() == rhs.size() && lhs < rhs); 
    } 
}; 

, 얼마나 많은 선행 0을 찾아 비교기 내부 따라 size을 조정 간단합니다. 숫자가 음수 일 수 있다면 부호를 감지하도록 비교기를 확장 한 다음 위의 비교와 비슷한 것을 적용 할 수 있습니다.

0

대신 표준지도를 사용할 수 있습니까?

// now since map is already sorted by keys, you look up on the integer to get the equivalent string. 
std::map<int, string> integersAndStrings; 
integersAndStrings[1] = "one"; 
integersAndStrings[2] = "two"; 
integersAndStrings[3] = "three"; 

또한 40two의 예를 변형하여 쓸 수도 있습니다. stoi 대신에 캐릭터를 비교할 자신의 술어를 만들 수 있습니다. lhs가 rhs보다 소수점 이하 자리수이면, lhs는 더 작은 숫자 여야합니다 (부동 소수점이 없다고 가정). 문자열을 비교하는 것 (즉 David Rodriguez이 답을 제시 한 것)보다 자릿수가 같아야합니다. 나는 그가 내 대답을 썼을 때 이미 그가 제안했음을 알지 못했다. 내가 추가하는 유일한 추가 작업은 실제로 다른 컨테이너 (예 : std :: map)를 사용하는 것입니다.