2016-10-10 5 views
-3

std::vector<unsigned char>を参照するC++の関数がある場合は、std::searchを使用して署名を見つけるにはどうすればよいですか?std :: searchを標準で使用する方法::参照渡しのベクトル?

int check (const std::vector<unsigned char>& vect) 
{ 
    std::string signature("<!-- signature -->"); 
    std::string signature2("<!-- another -->"); 
    std::vector<unsigned char>::iterator itr; 
    unsigned int kind = 0; 

    itr = std::search(vect.begin(),vect.end(),signature.begin(),signature.end()); 
    if (itr!=vect.end()) kind=1; 
    if (kind == 0) 
    { 
    itr = std::search(vect.begin(),vect.end(),signature2.begin(),signature2.end()); 
    if (itr!=vect.end()) kind=2; 
    } 
    return kind; 
} 

vectは、巨大であるので、それが動作コピー、悪いソリューションです:

のコードは次のようになります。

なぜこれはコンパイルされませんか?

+4

をコンパイラはあなたに言う...? –

答えて

2

問題は、あなたがconst std::vector<unsigned char>を反復処理しているということですが、あなたはそれからにイテレータを割り当てよう非const std::vector<unsigned char>::iterator

簡単な修正がitrの正しい型を宣言するために、次のようになります。

std::vector<unsigned char>::const_iterator itr; 

あなたがC++ 11を使用している場合、私はちょうど代わりにautoを使用します。何

auto itr = std::search(vect.begin(),vect.end(),signature.begin(),signature.end()); 
2

、GCC-5.1で正常に動作しexample here

#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 

bool check (const std::vector<unsigned char>& vect) 
{ 
    std::string signature("<!-- signature -->"); 
    auto itr = std::search(vect.begin(),vect.end(),signature.begin(),signature.end()); 
    if (itr!=vect.end()) /* do something */ 
    return false; 
} 

int main() { 
    check(std::vector<unsigned char>{'a', 'b', 'c'}); 
    return 0; 
} 
+0

申し訳ありません。例を作ったときに私のコードを修正しました。私はstd :: vector :: iterator itrを使いました。 –

+0

あなたのコードは動作しますが、私のコードは例よりはるかに複雑です。 –

+0

@ R.F.Luisだから、あなたが私たちに示していないコードでは再現できない問題に対処したいのですか?それと幸運... – Angew

-1

編集:以下間違っています。問題は、問題のコードが実際に問題を示していないことです。 TartanLlamaには適切なソリューションがあります。

編集2:私がこれを書いたとき、私は悪い一日を過ごしていました。 は、charunsigned charの差が問題の原因となる場合は別のタイプです。回です。ただし、「char既定の署名付きWindows」への参照は誤解を招きます。 です。charが署名されているかどうかは、実装が定義されているかどうか(Windowsの場合はデフォルトでsigned)ですが、符号付きか符号なしかにかかわらず、依然としてunsigned charまたはsigned charの区別できる型です。

std::string::beginは、イテレータをcharに返します。ベクターには、という符号なし charが含まれています。私は、あなたがcharに署名することがデフォルトである窓にいると思う。

修正が(この場合は安全である)再解釈キャストを行うことです。

const auto sigstart = reinterpret_cast<const unsigned char*>(&signature.front()); 
const auto itr = std::search(vect.begin(), vect.end(), 
          sigstart, sigstart+signature.len()); 
+0

これはまったく問題ではありません。 'char'と' unsigned char'は '=='と比較できます。 – Angew

+0

@Angew:はい。それを得ました:-(。 –

+1

しかし、これは積み重なっていませんが、これはよくある誤解のようです。'char'、' signed char'、 'unsigned char'は** 3つの異なるタイプです;単純な 'char'のための符号付きまたは符号なしの選択は実装固有であるが、' char'が別の型である、すなわち 'signed char'でも' unsigned char'でもないという事実を変更しない。 –

関連する問題