2011-11-22 20 views
5

Tôi đang xử lý vấn đề đọc số nguyên không dấu 64 bit unsigned long long từ một chuỗi. Mã của tôi nên làm việc cho cả GCC 4.3 và Visual Studio 2010.Chuyển đổi số nguyên 64 bit từ chuỗi

tôi đọc câu hỏi này và câu trả lời về chủ đề này: Read 64 bit integer string from file và thougth rằng strtoull sẽ làm cho công việc tốt và hiệu quả hơn so với sử dụng một std::stringstream. Rất tiếc, strtoull không khả dụng trong stdlib.h của Visual Studio.

Vì vậy, tôi đã viết một chức năng templated ngắn:

template <typename T> 
T ToNumber(const std::string& Str) 
{ 
    T Number; 
    std::stringstream S(Str); 
    S >> Number; 
    return Number; 
} 

unsigned long long N = ToNumber<unsigned long long>("123456789"); 

Tôi lo lắng về hiệu quả của giải pháp này như vậy, là có một lựa chọn tốt hơn trong escenario này?

+1

Đây có phải là điểm nóng của ứng dụng của bạn không? –

+0

@Violet: Không thực sự, nhưng nó tải các tệp lớn định kỳ để làm mới GUI và tôi muốn nó chạy mượt mà nhất có thể. –

+1

Bạn có thể viết chuyển đổi của riêng bạn. Nó có khả năng nhanh hơn sử dụng 'stringstream'. Xem điểm chuẩn tại đây: http://tinodidriksen.com/2010/02/16/cpp-convert-string-to-int-speed/ – Pablo

Trả lời

4

Xem http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/d69a6afe-6558-4913-afb0-616f00805229/

"Nó được gọi là _strtoui64(), _wcstoui64() và _tcstoui64(). Thêm vào đó là các phiên bản _l cho miền địa phương tùy chỉnh.
Hans passant."

Nhân tiện, cách thức của Google như thế này là thông báo rằng Google tự động cho rằng bạn sai (giống như các phiên bản mới hơn của Visual Studio) và tìm kiếm một thứ khác thay thế, vì vậy hãy nhớ nhấp vào liên kết để tìm kiếm những gì bạn đã nói với nó để tìm kiếm.

Cheers & h.,

+0

@ downlist của bạn: hãy giải thích câu trả lời của bạn, để những người khác có thể thấy lý do tại sao nó ngớ ngẩn và bỏ qua nó. –

2

Tất nhiên bạn có thể dễ dàng viết chức năng của riêng mình để xử lý các chuỗi thập phân đơn giản. Các hàm chuẩn xử lý các lựa chọn thay thế khác nhau theo cơ sở số và ngôn ngữ, làm cho chúng chậm trong mọi trường hợp.

Có, stringstream sẽ thêm phân bổ heap trên tất cả những điều đó. Không, hiệu suất thực sự không quan trọng cho đến khi bạn có thể nói sự khác biệt.

Có tùy chọn nhanh hơn, để sử dụng lớp không dùng nữa của bộ đệm (không do đó không tạo bản sao hoặc thực hiện phân bổ). Tôi sẽ không gọi đó là "tốt hơn" mặc dù.

1

Bạn có thể phân tích các chuỗi 9 chữ số tại một thời điểm bắt đầu từ phía sau và nhân với 1 000 000 000^i, tức là (8 chữ số cuối cùng * 1) + (8 chữ số tiếp theo * 1 tỷ) ... hoặc

(1000000000000000000)+(234567890000000000)+(123456789) 
+0

Nếu bạn muốn kết hợp một số cuộc gọi đến 'strtoul' thành một' strtoull', không, điều đó sẽ không hoạt động với các căn cứ không thập phân. Anh ta nên dừng vòng lặp với 'number = number * 10 + character - '0''. – Potatoswatter