2016-09-06 8 views
0

C++に新しく追加されました。私は検索しましたが、おそらく間違った言葉を使っています。高速アクセスのためにデータ領域を再定義する

Iは数バイトの長リテラル値が格納されている多くのスロットのアレイにおけるどのスロット見つけたいです。現在、各スロットを順番に確認してください。

それは一つの大きな文字列であるかのように、私は配列全体をスキャンするために内部関数を使用することができる場合、私は、これははるかに高速になる感じ。 (旧COBOLプログラマ)。

私はこれをしてください行うことができます任意の方法?

+0

をテスト/コンパイルされていない、あなたは 'のstd :: vector'に精通していますか?データをメモリに順次格納することが保証されます。また、コードサンプルを提供してください。 – AndyG

+0

もしあなたが大文字のように扱われるなら 'std :: string'を使わないのはなぜですか? – Hayt

+0

'std :: sort'はあなたが持っているような配列でも動作します。 – Rakete1111

答えて

1

リテラル値が格納されている長さが数多くあるスロットの配列内のスロットを探したいとします。現在、各スロットを順番に確認してください。

OK、私はパントを取り、それを推測するつもりです:

  1. あなたは、コンテナのいくつかの種類に任意の長さの文字列リテラルを格納したいです。

  2. の容器は、容器内の重複

  3. がありません(すなわち、あなたは意志でリテラルを追加することができます)変更可能でなければなりません。

  4. あなたは、リテラル文字列が以前コンテナに格納されているかどうかを知りたい、そして必要であれば、それはそうであったものを「位置」、あなたはそれを削除することができていること。

  5. 文字列リテラル

    は、ランダムな辞書順に挿入され、ソートする必要はありません。心にバネ

コンテナは、このコンテナのstd::unordered_set

#include <unordered_set> 
std::unordered_set<std::string> tokens; 

int main() 
{ 
    tokens.emplace("foo"); 
    tokens.emplace("bar"); 
    auto it = tokens.find("baz"); 
    assert(it == tokens.end()); // not found 
    it = tokens.find("bar");  // will be found 
    assert(it != tokens.end()); 
    tokens.erase(it);    // remove the token 
} 

検索時間の複雑さはO(1)。

0

既にコメントで分かったように、「一つの大きな文字列としてスキャンは、」C++に移動するための方法ではありません。

C++での典型的な

線形検索のために十分な速さで、通常はCスタイルの配列を使用して

auto myStr = "result"; 
auto it = std::find_if(std::begin(arr), std::end(arr), 
         [myStr](const char* const str) { return std::strcmp(mystr,str) == 0; }); 

は、その文字列が最初に間違った文字で、機能停止を比較覚えています。

よりC++スタイル:

std::vector<std::string> vec = { "res1", "res2", "res3" }; 
std::string myStr = "res2"; 
auto it = std::find(vec.begin(), vec.end(), myStr); 

あなたが大規模なコンテナのための非常に高速のルックアップに興味がある場合は、std::unordered_setが移動するための方法ですが、「スロット」は、その意味を失ったが、多分それでいケースstd::unordered_mapを使用できます。

std::unordered_set<std::string> s= { "res1", "res2", "res3" }; 
std::string myStr = "res2"; 
auto it = s.find(myStr); 

すべてのコードを例として書かれ、

関連する問題