2012-06-28 4 views
6

vector<char>std::string으로 변환하고 변환하는 것을 원합니다.<char>을 변환하는 문자열로 변환하십시오.

나는 거의 다 왔지만, 아래 코드의 결과는 vector<string>이며, 하나의 문자열 (벡터의 모든 문자열 부분을 연결)을 갖고 싶습니다.

자세한 내용은 코드 예제를 참조하십시오.

string ConvertHexToAscii(const char input) 
{ 
    std::ostringstream oss; 
    oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(input); 
    return oss.str(); 
} 

vector<char> readBuffer; // this is my input 

readBuffer.push_back(0x1c); 
readBuffer.push_back(0x09); 

vector<string> resultVec; 

std::transform(readBuffer.begin(), readBuffer.end() 
    , back_inserter(resultVec) 
    , ConvertHexToAscii); 

// resultVec[0] = "1C"; 
// resultVec[1] = "09"; 

"1C09"가 포함 된 문자열이 필요합니다. std::transform으로 어떻게 달성 할 수 있습니까?

답변

4

거의입니다. 이 작품은 :

std::stringstream sstr; 
std::transform(
    input.begin(), input.end(), 
    std::ostream_iterator<std::string>(sstr, ""), 
    ConvertHexToAscii); 

하지만 불행히도 이것은 매우 비효율적 인 문자열 스트림을 꽤 많이 인스턴스화합니다. 이상적으로는 ConvertHexToAscii (잘못 명명되었지만! C++은 인코딩에 대해 알지 못합니다) 함수는 기본 스트림을 직접 사용합니다.

+0

나는 이것을 좋아한다. 함수 출력 반복자를 사용하는 것보다 훨씬 간단하다. – Flexo

1

자신의 back_insert_iterator를 만들 문자열 유형 (당신의 STL과 lib 디렉토리에서 코드를 보면, 그것은 매우 간단)을하는 연산자 = 당신은 함수의 출력 반복자하여이 작업을 수행 할 수

template< class string_type, class value_type > 
class back_insert_iterator 
{ 
public: 
    back_insert_iterator<_string_type>& operator = (const value_type& val) 
    { 
    container->append(val) 
    return *this; 
    } 
}; 
1

과 같이 정의된다

#include <iostream> 
#include <sstream> 
#include <string> 
#include <algorithm> 
#include <iterator> 
#include <iomanip> 
#include <boost/function_output_iterator.hpp> 

std::string ConvertHexToAscii(const char input) 
{ 
    std::ostringstream oss; 
    oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(input); 
    return oss.str(); 
} 

int main() { 
    std::vector<char> readBuffer; // this is my input 

    readBuffer.push_back(0x1c); 
    readBuffer.push_back(0x09); 

    std::string temp; 

    std::transform(readBuffer.begin(), readBuffer.end() 
    , boost::make_function_output_iterator([&temp](const std::string& r) {temp.append(r);}) 
    , ConvertHexToAscii); 


    std::cout << temp << std::endl; 
} 

나는 결과 문자열에 append() 함수를 호출하는 람다를 사용하지만, 당신이 사용할 수없는 경우가 boost::bind를 사용하거나 당신을 위해 할 수있는 구식 펑터를 작성하는 매우 간단합니다. 대신

boost::make_function_output_iterator(boost::bind(static_cast<std::string& (std::string::*)(const std::string&)>(&std::string::append), &temp, _1)) 

:

boost::bind 함수와 출력 반복자로 만들어 얻는다. std::string::append에 대한 올바른 과부하를 선택해야하기 때문에 다소 부담 스럽습니다. 축적를 사용 perreal의 아이디어가 나쁘지 않다 반면

2
#include <iostream> 
#include <vector> 
#include <iomanip> 
#include <sstream> 
#include <numeric> 

std::string ConvertHexToAscii(std::string acc, char input) 
{ 
    std::ostringstream oss; 
    oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(input); 
    return acc + oss.str(); 
} 


int main() { 
    std::vector<char> readBuffer; // this is my input 
    readBuffer.push_back(0x1c); 
    readBuffer.push_back(0x09); 

    std::cout << std::accumulate(readBuffer.begin(), readBuffer.end() 
      , std::string(), ConvertHexToAscii) << std::endl; 

    return 0; 
} 
+0

+1 이것은 아주 좋은 해결책입니다! 나는'std :: accumulate'를 여기에 사용하지 않을 것입니다. 이것은 정확하게 내 질문에 대답하지 않지만, 그것은 아주 좋은 방법으로 내 문제를 해결합니다. – nabulke

0

, (이동 의미가 도움이 수 있지만) 많은 임시 문자열을 만드는 대신 직접 스트림에서 작동하도록 더 성능이 좋은 일 수 있습니다

std::ostringstream os; 
std::string temp = std::accumulate(
         readBuffer.begin(), readBuffer.end(), std::ref(os), 
         [](std::ostream &os, const char input) 
         -> std::reference_wrapper<std::ostream> { 
          return os << std::hex << std::setw(2) 
            << std::setfill('0') 
            << static_cast<int>(input); 
         }).str(); 

편집 :하지만 좋아, 그건 간단한 foreach 문이 (축적으로하는 경우에도 같은 의미 깨끗하지)도했을 것, 여기에 어쩌면 비트 oversophistication의 :

std::ostringstream os; 
std::for_each(readBuffer.begin(), readBuffer.end(), 
       [&os](const char input) mutable { 
        os << std::hex << std::setw(2) << std::setfill('0') 
        << static_cast<int>(input); 
       }); 
std::string temp = os.str(); 

하지만 임시 문자열을 모두 만드는 것보다 더 좋은 방법이있을 수 있습니다.

관련 문제