Namespaces
Variants
Views
Actions

Difference between revisions of "Template:cpp/container/at"

From cppreference.com
(Example)
m (Example: fix the output.)
 
(17 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{cpp/container/{{{1|}}}/title|at}}
+
{{#vardefine:cont|{{{1|inplace_vector}}}}}<!--
{{cpp/container/{{{1|}}}/navbar}}
+
-->{{cpp/container/{{#var:cont}}/title|at}}
 +
{{cpp/container/{{#var:cont}}/navbar}}
 
{{dcl begin}}
 
{{dcl begin}}
{{#switch:{{{1|}}}|array=
+
{{#switch:{{#var:cont}}
{{dcl rev multi|num=1
+
|array=
|dcl1=
+
{{dcl|num=1|since=c++11|notes={{mark constexpr since c++17}}|
 
reference at( size_type pos );
 
reference at( size_type pos );
|since2=c++17|dcl2=
 
constexpr reference at( size_type pos );
 
 
}}
 
}}
{{dcl rev multi|num=2
+
{{dcl|num=2|since=c++11|notes={{mark constexpr since c++14}}|
|dcl1=
+
 
const_reference at( size_type pos ) const;
 
const_reference at( size_type pos ) const;
|since2=c++14|dcl2=
 
constexpr const_reference at( size_type pos ) const;
 
 
}}
 
}}
 
|vector=
 
|vector=
{{dcl rev multi|num=1
+
{{dcl|num=1|notes={{mark constexpr since c++20}}|
|dcl1=
+
 
reference at( size_type pos );
 
reference at( size_type pos );
|since2=c++20|dcl2=
 
constexpr reference at( size_type pos );
 
 
}}
 
}}
{{dcl rev multi|num=2
+
{{dcl|num=2|notes={{mark constexpr since c++20}}|
|dcl1=
+
 
const_reference at( size_type pos ) const;
 
const_reference at( size_type pos ) const;
|since2=c++20|dcl2=
+
}}
 +
|inplace_vector=
 +
{{dcl|num=1|since=c++26|
 +
constexpr reference at( size_type pos );
 +
}}
 +
{{dcl|num=2|since=c++26|
 
constexpr const_reference at( size_type pos ) const;
 
constexpr const_reference at( size_type pos ) const;
 +
}}
 +
|span=
 +
{{dcl|since=c++26|
 +
constexpr reference at( size_type pos ) const;
 
}}
 
}}
 
|
 
|
{{dcl|num=1|since={{cpp/std|{{{1|}}}}}|
+
{{dcl|num=1|since={{cpp/std|{{#var:cont}}}}|
reference       at( size_type pos );
+
reference at( size_type pos );
 
}}
 
}}
{{dcl|num=2|since={{cpp/std|{{{1|}}}}}|
+
{{dcl|num=2|since={{cpp/std|{{#var:cont}}}}|
 
const_reference at( size_type pos ) const;
 
const_reference at( size_type pos ) const;
 
}}
 
}}
Line 40: Line 41:
 
Returns a reference to the element at specified location {{c|pos}}, with bounds checking.
 
Returns a reference to the element at specified location {{c|pos}}, with bounds checking.
  
If {{c|pos}} is not within the range of the container, an exception of type {{lc|std::out_of_range}} is thrown.
+
If {{c|pos}} is not within the range of the {{#switch:{{#var:cont}}|span=span|container}}, an exception of type {{lc|std::out_of_range}} is thrown.
  
 
===Parameters===
 
===Parameters===
Line 48: Line 49:
  
 
===Return value===
 
===Return value===
Reference to the requested element.
+
Reference to the requested element, i.e. {{#ifeq:{{#var:cont}}|span|{{c|*(data() + pos)}}|{{c|*(a.begin() + pos)}}}}.
  
 
===Exceptions===
 
===Exceptions===
{{lc|std::out_of_range}} if {{c|!(pos < size())}}.
+
{{lc|std::out_of_range}} if {{c|1=pos >= size()}}.
  
 
===Complexity===
 
===Complexity===
 
Constant.
 
Constant.
 
+
<!---->
 +
{{#ifeq:{{#var:cont}}|span|
 +
===Notes===
 +
{{feature test macro|__cpp_lib_span|std=C++26|value=202311L|{{tt|std::span::at}}}}
 +
}}
 +
<!---->
 
===Example===
 
===Example===
 
{{example
 
{{example
 
|code=
 
|code=
 +
#include <chrono>
 +
#include <cstddef>
 
#include <iostream>
 
#include <iostream>
#include <vector>
+
#include <{{#var:cont}}>
 +
#include <stdexcept>
  
 
int main()
 
int main()
 
{
 
{
     std::{{{1|vector}}}<int{{#ifeq: {{{1|vector}}}|array|,6}}> data = {1, 2, 4, 5, 5, 6};
+
     {{#switch:{{#var:cont}}
 +
    |deque|vector=
 +
    std::{{#var:cont}}<int> data{1, 2, 4, 5, 5, 6};
 +
    |array|inplace_vector=
 +
    std::{{#var:cont}}<int, 6> data{1, 2, 4, 5, 5, 6};
 +
    |span=
 +
    int x[]{1, 2, 4, 5, 5, 6};
 +
    std::span data(x);
 +
    }}
  
 
     // Set element 1
 
     // Set element 1
Line 76: Line 93:
 
     try
 
     try
 
     {
 
     {
         // Set element 6
+
         // Try to set an element at random position >= size()
         auto runtime_index = []{ return 6u; }(); // Emulate index obtained at runtime
+
         auto moon_phase = []
         data.at(runtime_index) = 666;
+
        {
 +
            return std::chrono::system_clock::now().time_since_epoch().count() % 8;
 +
        };
 +
         data.at(data.size() + moon_phase()) = 13;
 
     }
 
     }
     catch (std::out_of_range const& exc)
+
     catch(const std::out_of_range& ex)
 
     {
 
     {
         std::cout << exc.what() << '\n';
+
         std::cout << ex.what() << '\n';
 
     }
 
     }
  
Line 95: Line 115:
 
Element at index 2 has value 4
 
Element at index 2 has value 4
 
data size = 6
 
data size = 6
{{#switch:{{{1|}}}
+
{{#switch:{{#var:cont}}
|vector = vector::_M_range_check: __n (which is 6) >= this->size() (which is 6)
+
|vector=vector::_M_range_check: __n (which is 8) >= this->size() (which is 6)
|deque = deque::_M_range_check: __n (which is 6)>= this->size() (which is 6)
+
|deque=deque::_M_range_check: __n (which is 8) >= this->size() (which is 6)
|array = array::at: __n (which is 6) >= _Nm (which is 6)
+
|array=array::at: __n (which is 8) >= _Nm (which is 6)
|=std::out_of_range: pos >= size()
+
|#default=std::out_of_range: pos (which is 8) >= size() (which is 6)
 
}}
 
}}
 
data: 1 88 4 5 5 6
 
data: 1 88 4 5 5 6
Line 106: Line 126:
 
===See also===
 
===See also===
 
{{dsc begin}}
 
{{dsc begin}}
{{dsc inc|cpp/container/dsc operator_at|{{{1|}}}}}
+
{{dsc inc|cpp/container/dsc operator at|{{#var:cont}}}}
 
{{dsc end}}
 
{{dsc end}}

Latest revision as of 01:32, 16 August 2024

 
 
 
 
constexpr reference at( size_type pos );
(1) (since C++26)
constexpr const_reference at( size_type pos ) const;
(2) (since C++26)

Returns a reference to the element at specified location pos, with bounds checking.

If pos is not within the range of the container, an exception of type std::out_of_range is thrown.

Contents

[edit] Parameters

pos - position of the element to return

[edit] Return value

Reference to the requested element, i.e. *(a.begin() + pos).

[edit] Exceptions

std::out_of_range if pos >= size().

[edit] Complexity

Constant.

[edit] Example

#include <chrono>
#include <cstddef>
#include <iostream>
#include <inplace_vector>
#include <stdexcept>
 
int main()
{
    std::inplace_vector<int, 6> data{1, 2, 4, 5, 5, 6};
 
    // Set element 1
    data.at(1) = 88;
 
    // Read element 2
    std::cout << "Element at index 2 has value " << data.at(2) << '\n';
 
    std::cout << "data size = " << data.size() << '\n';
 
    try
    {
        // Try to set an element at random position >= size()
        auto moon_phase = []
        {
            return std::chrono::system_clock::now().time_since_epoch().count() % 8;
        };
        data.at(data.size() + moon_phase()) = 13;
    }
    catch(const std::out_of_range& ex)
    {
        std::cout << ex.what() << '\n';
    }
 
    // Print final values
    std::cout << "data:";
    for (int elem : data)
        std::cout << ' ' << elem;
    std::cout << '\n';
}

Possible output:

Element at index 2 has value 4
data size = 6
std::out_of_range: pos (which is 8) >= size() (which is 6)
data: 1 88 4 5 5 6

[edit] See also

access specified element
(public member function of std::inplace_vector<T,N>) [edit]