回答編集履歴
4
yumetodoさんからご指摘を受けて
answer
CHANGED
@@ -26,6 +26,20 @@
|
|
26
26
|
}
|
27
27
|
```
|
28
28
|
|
29
|
+
修正:yumetodoさんからご指摘を受けて
|
30
|
+
---
|
31
|
+
今回の場合、[std::next](https://cpprefjp.github.io/reference/iterator/next.html)の方が簡潔に処理を記述できるようです。
|
32
|
+
|
33
|
+
yumetodoさんが書かれたslice_sum関数はこちら。
|
34
|
+
> ```C++
|
35
|
+
template<typename T>
|
36
|
+
int slice_sum(const std::vector<T>& v, size_t from, size_t to) {
|
37
|
+
assert(to <= v.size());
|
38
|
+
return std::accumulate(std::next(v.cbegin(), from), std::next(v.cbegin(), to), T{});
|
39
|
+
}
|
40
|
+
> ```
|
41
|
+
|
42
|
+
|
29
43
|
コメントを受けて
|
30
44
|
---
|
31
45
|
構造体を利用する例。
|
3
追記
answer
CHANGED
@@ -24,4 +24,42 @@
|
|
24
24
|
|
25
25
|
return 0;
|
26
26
|
}
|
27
|
+
```
|
28
|
+
|
29
|
+
コメントを受けて
|
30
|
+
---
|
31
|
+
構造体を利用する例。
|
32
|
+
```C++
|
33
|
+
#include <iostream>
|
34
|
+
#include <numeric>
|
35
|
+
#include <vector>
|
36
|
+
|
37
|
+
struct Person {
|
38
|
+
Person(const std::string& name, const std::vector<int>& scores)
|
39
|
+
: name_(name), scores_(scores) { }
|
40
|
+
|
41
|
+
auto& get_name(void) const noexcept {
|
42
|
+
return this->name_;
|
43
|
+
}
|
44
|
+
auto& get_scores(void) const noexcept {
|
45
|
+
return this->scores_;
|
46
|
+
}
|
47
|
+
|
48
|
+
private:
|
49
|
+
const std::string& name_;
|
50
|
+
const std::vector<int> scores_;
|
51
|
+
};
|
52
|
+
|
53
|
+
int main(void) {
|
54
|
+
Person p("青木", {2, 3, 4, 5});
|
55
|
+
|
56
|
+
int sum = std::accumulate(
|
57
|
+
p.get_scores().cbegin(),
|
58
|
+
p.get_scores().cend(),
|
59
|
+
0
|
60
|
+
);
|
61
|
+
std::cout << p.get_name() << " sum : " << sum << std::endl;
|
62
|
+
|
63
|
+
return 0;
|
64
|
+
}
|
27
65
|
```
|
2
assert追加
answer
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
[std::advance](https://cpprefjp.github.io/reference/iterator/advance.html)を使うと良いかと思います。
|
2
2
|
```C++
|
3
|
+
#include <cassert>
|
3
4
|
#include <iterator>
|
4
5
|
#include <iostream>
|
5
6
|
#include <numeric>
|
6
7
|
#include <vector>
|
7
8
|
|
8
9
|
int slice_sum(const std::vector<int>& v, size_t from, size_t to) {
|
10
|
+
assert(to <= v.size());
|
11
|
+
|
9
12
|
auto it_begin = v.cbegin(), it_end = v.cend();
|
10
13
|
std::advance(it_begin, from);
|
11
14
|
std::advance(it_end, to-v.size());
|
1
成形
answer
CHANGED
@@ -19,6 +19,6 @@
|
|
19
19
|
int sum = slice_sum(v, 1, v.size());
|
20
20
|
std::cout << "sum : " << sum << std::endl;
|
21
21
|
|
22
|
-
|
22
|
+
return 0;
|
23
23
|
}
|
24
24
|
```
|