2017-02-21 6 views
0

サブストリングを取得し、それをさらに処理するためにlong intに変換することに興味があります。私は多数の文字列に対してこれを行う必要があります。現在、私がしているのは、Testのように、.substr()を使用しています。サブストリングを最速で取得する

// Example program 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::string content = "123421341234432231112343212343"; 
    unsigned long int sub = atol(content.substr(0,18).c_str()); 
    std::cout << "sub: " << sub << '\n'; 
    return 0; 
} 

私はこれを行う最も速い方法を知りたいと思います。それはいつも.substr(0,18)ではない、それは長さ18の何でもよい(18でないならば残りの長さ).substr(i,18)

編集:文字列の数について 、約30万人程度速い(私はサブストリングのコピーを取得すると思うし、次にlong intに変換すると、ゆっくりとしたプロセスである私はそれが.substr()方法よりも高速になりたいです。) 。正直言って、私はできるだけ速くしたい。

実際には、文字列はfastaファイル内にあり、それぞれを一度に読み取って不要なコンテンツをboost::split()で削除し、必要なコンテンツを保存します。次に、さらなる処理のために文字列の異なる部分文字列を取得するという異なるパスを実行する必要があります。

+0

「大量」と言うとき、それはどういう意味ですか?あなたが「最速の方法」と言ったら、それはどういう意味ですか? *何よりも速い?あなたのベースラインの「堅牢性」は何ですか?どのように測定し、プロファイルしますか?なぜあなたが表示するコードが「最速」ではないと思いますか?詳しく教えてください! –

+0

@Someprogrammerdudeありがとう、親切に編集を参照してください。 – AwaitedOne

+1

std :: stringsの作成をスキップし、 'char *'を使うことができます。取得したい部分文字列が常に(0,18)であれば、破壊的なメソッドを使うことができます: 'char * content =" whatever "; content [19] = 0; '文字列の最後を切り取る。 – Steeve

答えて

2

取得したサブストリングと最速の方法

に長整数に変換するには...ほぼ確実間違った質問です。

あなたの現在の文字列と部分文字列を作成する:あなたは常に最初に測定する必要があり、あなたが実際に必要なものの性能を知っている必要があり、あなたは本当に私たちにそれらを支援するための十分な情報を与えられていないことを警告して

フォームは整数変換よりもはるかに高価になる可能性があるため、間違ったことを心配しています。最初にプロファイリングするとこれが表示されます。

(プロファイリング後、私が正しく推測したと仮定して)、コピーとダイナミックアロケーションを取り除くことから始めます:std::stringsubstrを完全に停止してください。生のバッファー上で直接作業してください。

+0

実際には、部分文字列を取得するのに、整数変換に要する時間は心配していません。 – AwaitedOne

+0

私は生のバッファを知りませんが、小さな例を提供すると素晴らしいでしょう – AwaitedOne

+0

1.使用するI/Oシステム( 'iostream'、' cstdio'など)を選択します。 2.入力バッファにどのようなアクセスが提供されているかを調べます( 'ifstream'を選択した場合は' rdbuf'、 'fread'を呼び出した場合はあなたが所有するchar配列です)。 3.文字列に文字をコピーしないで、文字列のビットを他の文字列にコピーすることなく、可能な限り直接使用します。 – Useless

関連する問題