2016-05-06 7 views
-2

2次元ベクトルの文字だけを見つけて1次元ベクトルにコピーする必要があります。例えば、ベクターが含まれている可能性があり:ベクトルの文字だけをC++の別のベクトルにコピーする

3 4 5 
A B 
A C 
A B 
B C 
1 C 3 

その後、新しいベクトルが含まれます

A B C 

文字が繰り返されてはなりません。 これは大きなプロジェクトの一環であり、私はこの部分で立ち往生しています。

bool seen[26] = { false }; 
for (const auto& v : v2d) 
    for (const auto& c : v) 
     if ('A' <= c && c <= 'Z') 
      seen[c - 'A'] = true; 
std::string result; 
for (char c = 'A'; c <= 'Z'; ++c) 
    if (seen[c - 'A']) result += c; 
+1

これは宿題のようです。だから、私はあなたに(1) 'char'が文字かどうかを知る関数があると伝えます(http://en.cppreference.com/w/cpp/string/byte/isalpha)。 (2) 'std :: set '(http://www.cplusplus)のように、文字を別のものにコピーしてから最終的な 'std :: vector 'にコピーすることは意味があります。 (あるいは、すべての文字を最後の 'std :: vector 'にコピーして、重複を取り除くことができます( 'std :: sort()'、 'std :: unique () 'http://www.cplusplus.com/reference/algorithm/unique/を呼び出し、ベクター上で' erase() 'を呼び出す))。 –

+0

@ジャックあなたのコードを質問に編集して、人々が問題の内容を解答できるようにします。 – Galik

+0

@Galik Done。ありがとうございました。 – Jack

答えて

0

だから私はこれら二つのベクトル持っていた:私はisalphaを使用するように言われた

vector<vector<string>> gateInputs; //2D vector with data 
vector<string> Letters; // Vector where I'll store only the letters 

を、それが唯一のcharで動作し、私のベクトルがあります私はベクトル0で文字のみを保存するために、その関数を呼び出した後

bool all_alpha(const std::string& str) 
{ 
    for (std::size_t i = 0; i < str.size(); ++i) 
    if (!std::isalpha(str[i])) return false; 
} 

:タイプstringで、私は次の関数を使用しました:

for (int i = 0; i <gateInputs.size(); i++) 
    { 
    for (int j = 0; j<gateInputs[i].size(); j++) 
    { 
     if (all_alpha(gateInputs[i][j])) 
     { 
      string m = gateInputs[i][j]; 
      Letters.push_back(m); 
     } 
    } 
} 

今、ベクトルLettersには、次のものが含まれています

A B A C A B B C C 

その後、私はちょうどベクトルをソートし、重複を削除する必要がありました:

// Sort letters in vector 
sort(Letters.begin(), Letters.end()); 
// Erase duplicates 
Letters.erase(unique(Letters.begin(), Letters.end()), Letters.end()); 

およびDONEを!配列には以下が含まれます:

A B C 
3

あなたは、配列を使用して見てきた手紙を追跡することができます。あなたのベクトルがセットに変更して、あなたは右の動作を取得します:

std::set<string> Letters; 
0

あなたは手紙のために間違ったコンテナを使用します。

関連する問題