mitchan5
@mitchan5 (hiro Minami)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

再帰関数 EX20 - 報告書の枚数

解決したいこと

以下の問題を解く再起関数がうまく動かず、なぜエラーが起きているのかわかりません。

問題文
あなたはA社を経営する社長です。 A社はN個の組織からなり、それぞれに0番からN−1番の番号が付いています。 0番の番号が付いた組織はトップの組織です。

組織間には親子関係があり、0番以外のN−1個の組織には必ず1つの親組織があります。 子組織は複数になることがあります。 また、それぞれの組織は直接的または間接的にトップの組織と関係があるものとします。

あなたは全ての組織に報告書を提出するように求めました。 混雑を避けるために、「各組織は子組織の報告書がそろったら、自身の報告書を加えて親組織に渡す」ことを繰り返します。 子組織が無いような組織はすぐに親組織に報告書を渡します。 トップの組織は子組織の報告書がそろったら、自身の報告書を加えて社長に提出します。

それぞれの組織が1枚の報告書を提出します。

各組織について、「その組織が親組織に提出することになる報告書の枚数」を出力するプログラムを作成してください。 ただしトップの組織については「社長に提出する報告書の枚数」を出力してください。

発生している問題・エラー

./Main.cpp: In function ‘int counte(std::vector >&, int)’:
./Main.cpp:29:19: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
29 | for(int j=0; j < vec2.at(i).size(); j++){
| ~~^~~~~~~~~~~~~~~~~~~
./Main.cpp:30:41: error: call of overloaded ‘counte(std::vector >&, __gnu_cxx::__alloc_traits, int>::value_type&)’ is ambiguous
30 | s += counte(vec2, vec2.at(i).at(j));
| ^
./Main.cpp:4:5: note: candidate: ‘int counte(std::vector >, int)’
4 | int counte(vector> vec2, int i);
| ^~~~~~
./Main.cpp:25:7: note: candidate: ‘int counte(std::vector >&, int)’
25 | int counte(vector> &vec2, int i){
| ^~~~~~

該当するソースコード

C++
ソースコードを入力
#include
using namespace std;

int count(vector> vec2, int i);

int main() {
int N;
cin >> N;
vector vec(N);
vec.at(0)=-1;
for(int i=1; i> vec.at(i);

vector> vec2(N);
for(int i=0; i<N; i++){
for(int j=1; j<N; j++){
if(vec.at(j)==i){
vec2.at(i).push_back(j);
}
}
}

cout << count(vec2, 0) << endl;
}

int count(vector> &vec2, int i){
int s=0;
if(vec2.at(i).size()==0) return 1;

for(int j=0; j < vec2.at(i).size(); j++){
s += count(vec2, vec2.at(i).at(j));
}
return s+1;
}

すみません何故か int countの引数の型vector vector intがうまく表示されません。

自分で試したこと

for(int j=0; j < vec2.at(i).size(); j++)でエラーが出ているのですが、何が間違っているのかがわかりません。。

0

1Answer

はじめに

ソースコードは必ずコードブロックの中に書いてください.でないと,mitchan5さんの書いたようにうまく表示されなくなります.Qiitaで書くMarkdownの特性上,HTMLタグと混同されて消滅する部分があります.また,コードを見る側としてもかなり見づらいです.

コードブロックは,バッククォート`を3つ並べて

(必ず空行1行はさむ)
```c++:title
コード本文
```

のようにして書く必要があります.質問のテンプレートにもあらかじめ記述されているはずです.活用してください.エラー文も同様に別のコードブロックの中に収めていただけると助かります.前回はできていたのになぜ...

本題

mitchan5さんがエラーだと思われて示したfor(int j = 0; j < vec2.at(i).size(); j++)の箇所は,Warningです1.コンパイルが実行されなかったのはその次のErrorが原因です.

内容は

error: call of overloaded ‘counte(std::vector<std::vector >&, __gnu_cxx::__alloc_traits<std::allocator, int>::value_type&)’ is ambiguous

ですね,これは関数のプロトタイプ宣言と,実際に定義された関数に差分があったから吐かれたエラーです.

具体的には

// プロトタイプ宣言部
int count(vector<vector<int>> vec2, int i);

// 関数定義部
int count(vector<vector<int>> &vec2, int i){}

のように,&が付いているのと付いていないので差分が生じていることに起因するエラーです.出題ページを見る限り,参照渡しにしている方が正しい記述のようですね.

エラー文をしっかり読んで,WarningとErrorの違いを適切に識別できるようになりましょう.

  1. このWarningの原因は文を読んでわかる通り,intであるjstd::vector<int>::size_typeであるvec2.at(i).size()という別の型を比較しようとしたことに起因するものです.実際比較は可能なのでErrorではなくWarningで済んでいます.このWarningの解消のためにはこれらを比較しているj < vec2.at(i).size()の箇所をj < (int)vec2.at(i).size()として,size_typeint型にキャストしてください.

1Like

Comments

  1. @mitchan5

    Questioner

    前回に引き続きありがとうございます!
    キャスト違いによるWarning の説明まで丁寧にありがとうございます!
    ソースコードの書き方以後気を付けます、すみません、、、

  2. 余談ですが比較演算子==,<,>や代入演算子=,算術演算子+,-,*,/の前後に空白を入れる,ブロック{}の前の()とは空白を開けるなど,見やすくするようにAtCodeでは解説されていると思いますので,これらのコーディング規約を真似していっていただけると助かります.APG4bももう少しで終わりみたいなので次のAtCoder Beginners Selectionでは何事もなく終えれることを期待しております.頑張ってください!

Your answer might help someone💌