2017-09-15 2 views
1

a=0b=1などで始まるアルファベットの出現を印刷する次のプログラムを作成しました。誰かが、なぜstd :: distanceを使用して空白を表示しているのかを指摘してもらえますか?-、どうすればそれを取り除くことができますか?これらの2つの反復子間の距離は負であるのでなぜstd :: distanceは `-`を出力しますか?

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

using namespace std; 

int main() 
{ 
    string str; 
    cin>>str; 

    int n=str.size(); 
    std::vector<char> table(26); 
    table = { 
     'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' 
    }; 

    int i=0; 
    while(i<n) { 
     char c=str[i]; 
     auto search = std::find(table.begin(), table.end(), c); 
     if(search!=table.end()) { 
      int dist = std::distance(search, table.begin()); 
      cout<<dist;  //prints out -0-1-2-3 instead of 0123, why? 
     } 
     i++; 
    } 

    return 0; 
} 

作業プログラムhere

+2

が含まれますことを提供したい場合は、std::distanceの呼び出しを使用することができますが、それは '-'印刷さゼロの前にあなたは確かにいますか?それは私がそれを試してみません。 –

+0

あなたのリンクではdistの正しい方法があるdist = std :: distance(table.begin()、search);あなたのコードは異なる –

+0

@ HariomSingh、それは後で変更したからです。 –

答えて

4

あります。あなたは間違った順序でそれらを持っています。 「より小さい」反復子は、右ではなく左にあるべきです。

あなたが持っている:std::distance(search, table.begin())

は、あなたが持っている必要があります:std::distance(table.begin(), search)

+0

ああ、それについては決して考えなかった。したがって、「ダッシュ」は明らかに負の符号です!ありがとうございました! :)できるだけ早くあなたの答えを受け入れます。 –

+0

@UmedhSinghBundela修正。 – cdhowie

+1

@UmedhSinghBundelaは本当に '-0-1-2-3'や' 0-1-2-3'を印刷しますか? – user463035818

3

のstd ::距離を使用すると、空白の-

-文字をプリントアウトである理由は、マイナス記号です。負の数を表すために使用されます。負の数を印刷するので、-が印刷されます。最初の引数が2番目の引数より後であるため、距離は負の数です。

どのように私はそれを取り除くことができましたか?

あなたは後者に以前の位置からの距離を計算すると、距離は正となります:あなたは知っています。この場合

std::distance(table.begin(), search); 

が、場合にあなたが知っているか気にしません

std::abs(std::distance(it1, it2)); 

PS:順序とだけ絶対距離をしたい、あなたは機能std::absを使用してそれを得ることができます。後者のイテレータを最初に渡すことは、イテレータがランダムアクセスの場合にのみ許可されます。

+0

負の距離では、すべてのコンテナが動作しないことに注意してください。リンクされたリストのような(おそらくほとんどの)コンテナは、負の距離を計算するように要求された場合、未定義の動作を行います。 –

0

標準機能std::distanceは、[start, target]の範囲を受け入れます。だから、クラステンプレートstd::vectorは、ランダムアクセスイテレータを持っているので、あなただけの

auto dist = search - table.begin(); 

を書くことができます

auto dist = std::distance(table.begin(), search); 

または関数std::distanceを使用せずに記述する必要があります。

プログラムについてのいくつかの言葉。

std::vectorなどの標準コンテナの代わりにC文字列を使用し、それに対応してC++アルゴリズムの代わりに標準C関数を使用する方がよい場合があります。例えば

Umedh Singh Bundela 

を入力する場合はプログラムは次のよう

#include <iostream> 
#include <string> 
#include <cstring> 
#include <cctype> 

int main() 
{ 
    const char *table = "abcdefghijklmnopqrstuvwxyz"; 
    std::string s; 

    std::getline(std::cin, s); 

    for (char c : s) 
    { 
     c = std::tolower((unsigned char)c); 

     if (const char *p = std::strchr(table, c)) 
     { 
      std::cout << p - table << ' '; 
     } 
    } 

    std::cout << std::endl; 

    return 0; 
} 

を見ることができます

出力は声明の中で代わりに式の

20 12 4 3 7 18 8 13 6 7 1 20 13 3 4 11 0 

のようになります。

std::cout << p - table << ' '; 

あなたは、ヘッダー<iterator>

std::cout << std::distance(table, p) << ' '; 
関連する問題