2012-09-11 95 views
0

我實現了下面的代碼,它做它應該做的事,但我認爲它可以/應該被簡化。從字符構造字符串流

基本上,我需要創建一個數字向量,每個數字都包含testString中的一個數字。有沒有什麼辦法直接從char(即testString [i])構造stringstream?我寧願不涉及C風格的函數,如atoi,如果它可以用C++方式完成的話。

#include <iostream> 
#include <string> 
#include <sstream> 
#include <vector> 

int main() 
{ 
    std::string testString = "abc123.bla"; 
    std::string prefix = "abc"; 

    std::vector<unsigned short> digits; 

    if (0 == testString.find(prefix)) 
    { 
     for (size_t i = prefix.size(); i < testString.find("."); ++i) 
     { 
      int digit; 
      std::stringstream digitStream; 
      digitStream << testString[i]; 
      digitStream >> digit; 
      digits.emplace_back(digit); 
     } 
    } 

    for (std::vector<unsigned short>::iterator digit = digits.begin(); digit < digits.end(); ++digit) 
    { 
     std::cout << *digit << std::endl; 
    } 

    return 0; 
} 
+0

您可以使用字符串構造函數,該字符串構造函數將字符和該字符的編號構造出來(例如'(3,'a')== aaa')。 – chris

+0

'testString [i] - '0''如果我理解正確。 – oldrinb

+0

@oldrinb在迭代過程中,testString [i]將評估爲'1','2','3'。 –

回答

1

假設testString[i]'0''9'之間,只是做:

digits.emplace_back(testString[i] - '0'); 
+0

Ohhhhhh ...好主意!爲什麼我沒有看到?謝謝! :) –

+0

@jrok,沒有匹配的字符串構造函數。從技術上講,你可以嘗試像'std :: string num(123);'這樣的東西,它可以構造任何字符123,而不是123的長度或123的字符串表示。 – chris

+1

@chris你說得對,謝謝。我只是假定它會,我從來沒有實際上構造1個字符串之前:)這一個工程:'std :: istringstream digitStream(std :: string(1,testString [i]));' – jrok

1

my original comment;從每個數字字符中減去'0'

#include <string> 
#include <vector> 
#include <algorithm> 
#include <iterator> 
#include <cctype> 
#include <functional> 
#include <iostream> 

... 

std::string input = "abc123.bla"; 
std::string prefix = "abc"; 
std::vector<unsigned short> digits; 

auto input_b = input.begin(); 
std::copy_if(input_b, std::find(input_b, input.end(), '.'), 
    std::back_inserter(digits), (int (*)(int)) std::isdigit); 

auto digits_b = digits.begin(); 
auto digits_e = digits.end(); 
std::transform(digits_b, digits_e, digits_b, 
    std::bind2nd(std::minus<unsigned short>(), '0')); 
std::copy(digits_b, digits_e, 
    std::ostream_iterator<unsigned short>(std::cout, "\n")); 

如果您不需要digits來包含中間數字值,甚至可以縮短它。

std::transform(digits.begin(), digits.end(), 
    std::ostream_iterator<unsigned short>(std::cout, "\n"), 
    std::bind2nd(std::minus<unsigned short>(), '0')); 
+0

感謝您花時間提供這種精心製作的方法,但恐怕我對STL的瞭解不足以理解那裏發生的事情。我會研究'std :: copy_if','std :: back_inserter','std :: transform','std :: bind2nd'和'std :: minus',因爲我以前從未使用過它們。 –