teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

yumetodoさんからご指摘を受けて

2018/01/24 05:42

投稿

LouiS0616
LouiS0616

スコア35678

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

追記

2018/01/24 05:42

投稿

LouiS0616
LouiS0616

スコア35678

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追加

2018/01/23 16:20

投稿

LouiS0616
LouiS0616

スコア35678

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

成形

2018/01/23 15:54

投稿

LouiS0616
LouiS0616

スコア35678

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
- return 0;
22
+ return 0;
23
23
  }
24
24
  ```