Namespaces
Variants

std::iota

cppreference.net에서
 
 
알고리즘 라이브러리
제약된 알고리즘 및 범위에 대한 알고리즘 (C++20)
제약된 알고리즘, 예: ranges::copy, ranges::sort, ...
정렬 및 관련 연산
분할 연산
(C++11)    

정렬 연산
이진 검색 연산
(분할된 범위에서)
집합 연산 (정렬된 범위에서)
병합 연산 (정렬된 범위에서)
힙 연산
최소/최대 연산
(C++11)
(C++17)
사전식 비교 연산
순열 연산


 
 
헤더 <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 of ForwardIt 으로 변환할 수 없습니다.
  • 표현식 ++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

같이 보기

시작 값의 연속적인 증가분으로 범위를 채웁니다
(알고리즘 함수 객체)
주어진 값을 범위의 모든 요소에 복사 할당합니다
(함수 템플릿 & 알고리즘 함수 객체)
범위의 요소들에 특정 값을 할당합니다
(알고리즘 함수 객체)
연속적인 함수 호출의 결과를 범위의 모든 요소에 할당합니다
(함수 템플릿 & 알고리즘 함수 객체)
함수의 결과를 범위에 저장합니다
(알고리즘 함수 객체)
초기 값을 반복적으로 증가시켜 생성된 시퀀스로 구성된 view
(클래스 템플릿) (사용자 지정 지점 객체)
view 로 0 부터 n
까지 증가하는 값들의 시퀀스를 생성합니다(사용자 지정 지점 객체)
view 로 적응된 시퀀스의 각 요소를 요소의 위치와 값으로 구성된 튜플에 매핑합니다
(클래스 템플릿) (범위 어댑터 객체)