回答編集履歴

2 追記

episteme

episteme score 7629

2019/04/17 18:23  投稿

```C++
int* AbundantNumber(int num) {
   int sum = 0;
   std::vector<int> ans; // ansはローカル変数だから
   for (int i = 1; i <= num; ++i) {
       if (IsAbundantNumber(i)) {
           ans.emplace_back(i);
       }
   }
   ans.emplace_back(-1);
   return &ans.front(); // return直前にansが廃棄され、結果&ans.front() はゴミとなる。
}
```
なので解決策としては static std::vector<int> ans; しといて、
呼ばれるたびに ans.clear(); でどうじゃろ。
※ マルチスレッドだとアレだけど。
※ マルチスレッドだとアレだけど。
[別解]
```C++
template<typename OutputIterator>
OutputIterator AbundantNumber(int num, OutputIterator out) {
   for (int i = 1; i <= num; ++i) {
       if (IsAbundantNumber(i)) {
           *out++ = i;
       }
   }
   return out;
}
// call側はたとえば:
 std::vector<int> result;
 AbundantNumber(5, std::back_inserter(result));
 // 結果は resultに入ってる。
```
1 加筆

episteme

episteme score 7629

2019/04/15 04:43  投稿

```C++
int* AbundantNumber(int num) {
   int sum = 0;
   std::vector<int> ans; // ansはローカル変数だから
   for (int i = 1; i <= num; ++i) {
       if (IsAbundantNumber(i)) {
           ans.emplace_back(i);
       }
   }
   ans.emplace_back(-1);
   return &ans.front(); // return直前にansが廃棄され、結果&ans.front() はゴミとなる。
}
```
```
なので解決策としては static std::vector<int> ans; しといて、
呼ばれるたびに ans.clear(); でどうじゃろ。
※ マルチスレッドだとアレだけど。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る