std::iota
cppreference.net에서
| 헤더 <numeric>
|
||
template< class ForwardIt, class T >
void iota( ForwardIt first, ForwardIt last, T value );
|
에 정의됨 (C++11부터) (C++20부터 constexpr) |
|
범위 [first, last) 를 value 부터 시작하여 ++value 를 반복적으로 평가함으로써 순차적으로 증가하는 값들로 채웁니다.
동등한 연산 (++value 이 증가된 값을 반환한다고 가정):
*first = value;
*++first = ++value;
*++first = ++value;
*++first = ++value;
// repeats until “last” is reached
다음 조건 중 하나라도 충족되면 프로그램의 형식이 잘못되었습니다(ill-formed):
T은(는) value type ofForwardIt으로 변환할 수 없습니다.- 표현식
++val이 잘못된 형식입니다. 여기서val은(는)T유형의 변수입니다.
매개변수
| first, last | - | range 를 정의하는 반복자 쌍으로, value
|
| value 부터 시작하여 순차적으로 증가하는 값들로 채울 요소들의 범위입니다. | - | 저장할 초기 값 |
복잡도
정확히 std::distance(first, last) 번의 증가 및 할당.
가능한 구현
template<class ForwardIt, class T>
constexpr // since C++20
void iota(ForwardIt first, ForwardIt last, T value)
{
for (; first != last; ++first, ++value)
*first = value;
}
|
참고
이 함수는 프로그래밍 언어 APL 의 정수 함수 ⍳ 에서 이름을 따왔습니다. 이 함수는 C++98에 포함되지 않았던 STL 구성 요소 중 하나였으나 C++11에서 표준 라이브러리에 포함되었습니다.
예제
다음 예제는 std::shuffle 을 std::vector의 std::list 반복자들에 적용합니다. std::iota 는 컨테이너를 채우는 데 사용됩니다.
이 코드 실행
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <list>
#include <numeric>
#include <random>
#include <vector>
class BigData // inefficient to copy
{
int data[1024]; /* some raw data */
public:
explicit BigData(int i = 0) { data[0] = i; /* ... */ }
operator int() const { return data[0]; }
BigData& operator=(int i) { data[0] = i; return *this; }
/* ... */
};
int main()
{
std::list<BigData> l(10);
std::iota(l.begin(), l.end(), -4);
std::vector<std::list<BigData>::iterator> v(l.size());
std::iota(v.begin(), v.end(), l.begin());
// Vector of iterators (to original data) is used to avoid expensive copying,
// and because std::shuffle (below) cannot be applied to a std::list directly.
std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()});
std::cout << "Original contents of the list l:\t";
for (const auto& n : l)
std::cout << std::setw(2) << n << ' ';
std::cout << '\n';
std::cout << "Contents of l, viewed via shuffled v:\t";
for (const auto i : v)
std::cout << std::setw(2) << *i << ' ';
std::cout << '\n';
}
가능한 출력:
Original contents of the list l: -4 -3 -2 -1 0 1 2 3 4 5
Contents of l, viewed via shuffled v: -1 5 -4 0 2 1 4 -2 3 -3
같이 보기
(C++23) |
시작 값의 연속적인 증가분으로 범위를 채웁니다 (알고리즘 함수 객체) |
| 주어진 값을 범위의 모든 요소에 복사 할당합니다 (함수 템플릿 & 알고리즘 함수 객체) | |
(C++20) |
|
(C++20) |
범위의 요소들에 특정 값을 할당합니다 (알고리즘 함수 객체) |
| 연속적인 함수 호출의 결과를 범위의 모든 요소에 할당합니다 (함수 템플릿 & 알고리즘 함수 객체) | |
(C++20) |
|
(C++20) |
함수의 결과를 범위에 저장합니다 (알고리즘 함수 객체) |
(C++20) |
초기 값을 반복적으로 증가시켜 생성된 시퀀스로 구성된 view (클래스 템플릿) (사용자 지정 지점 객체) |
(C++26) |
view 로 0 부터 n까지 증가하는 값들의 시퀀스를 생성합니다(사용자 지정 지점 객체) |
| view 로 적응된 시퀀스의 각 요소를 요소의 위치와 값으로 구성된 튜플에 매핑합니다 (클래스 템플릿) (범위 어댑터 객체) |