Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::map<Key,T,Compare,Allocator>::operator[]

      From cppreference.com
      <cpp‎ |container‎ |map

      [edit template]
       
       
       
      std::map
      Member functions
      Non-member functions
      (until C++20)(until C++20)(until C++20)(until C++20)(until C++20)
      Deduction guides(C++17)
       
      T& operator[](const Key& key);
      (1)
      T& operator[]( Key&& key);
      (2)(since C++11)
      template<class K>
      T& operator[]( K&& x);
      (3)(since C++26)

      Returns a reference to the value that is mapped to a key equivalent tokey orx respectively, performing an insertion if such key does not already exist.

      1) Insertsvalue_type(key, T()) if the key does not exist.
      -
      key_type must meet the requirements ofCopyConstructible.
      -
      mapped_type must meet the requirements ofCopyConstructible andDefaultConstructible.
      If an insertion is performed, the mapped value isvalue-initialized (default-constructed for class types, zero-initialized otherwise) and a reference to it is returned.
      (until C++11)
      1) Inserts avalue_type object constructed in-place fromstd::piecewise_construct,std::forward_as_tuple(key),std::tuple<>() if the key does not exist.
      Equivalent toreturn this->try_emplace(key).first->second;.(since C++17)When the default allocator is used, this results in the key being copy constructed fromkey and the mapped value beingvalue-initialized.
      -
      value_type must beEmplaceConstructible fromstd::piecewise_construct,std::forward_as_tuple(key),std::tuple<>(). When the default allocator is used, this means thatkey_type must beCopyConstructible andmapped_type must beDefaultConstructible.
      2) Inserts avalue_type object constructed in-place fromstd::piecewise_construct,std::forward_as_tuple(std::move(key)),std::tuple<>() if the key does not exist.
      Equivalent toreturn this->try_emplace(std::move(key)).first->second;.(since C++17)
      When the default allocator is used, this results in the key being move constructed fromkey and the mapped value beingvalue-initialized.
      -
      value_type must beEmplaceConstructible fromstd::piecewise_construct,std::forward_as_tuple(std::move(key)),std::tuple<>(). When the default allocator is used, this means thatkey_type must beMoveConstructible andmapped_type must beDefaultConstructible.
      (since C++11)
      3) Inserts avalue_type object constructed in-place if there is no key that transparently comparesequivalent to the valuex.
      Equivalent toreturn this->try_emplace(std::forward<K>(x)).first->second;.This overload participates in overload resolution only ifCompare istransparent. It allows calling this function without constructing an instance ofKey.

      No iterators or references are invalidated.

      Contents

      [edit]Parameters

      key - the key of the element to find
      x - a value of any type that can be transparently compared with a key

      [edit]Return value

      1,2) A reference to the mapped value of the new element if no element with keykey existed. Otherwise, a reference to the mapped value of the existing element whose key is equivalent tokey.
      3) A reference to the mapped value of the new element if no element with key that compares equivalent to the valuex existed. Otherwise, a reference to the mapped value of the existing element whose key compares equivalent tox.

      [edit]Exceptions

      If an exception is thrown by any operation, the insertion has no effect.

      [edit]Complexity

      Logarithmic in the size of the container.

      [edit]Notes

      In the published C++11 and C++14 standards, this function was specified to requiremapped_type to beDefaultInsertable andkey_type to beCopyInsertable orMoveInsertable into*this. This specification was defective and was fixed byLWG issue 2469, and the description above incorporates the resolution of that issue.

      However, one implementation (libc++) is known to construct thekey_type andmapped_type objects via two separate allocatorconstruct() calls, as arguably required by the standards as published, rather than emplacing avalue_type object.

      operator[] is non-const because it inserts the key if it doesn't exist. If this behavior is undesirable or if the container isconst,at may be used.

      insert_or_assign returns more information thanoperator[] and does not require default-constructibility of the mapped type.

      (since C++17)
      Feature-test macroValueStdFeature
      __cpp_lib_associative_heterogeneous_insertion202311L(C++26)Heterogeneous overloads for the remaining member functions inordered andunordered associativecontainers.(3)

      [edit]Example

      Run this code
      #include <iostream>#include <string>#include <map> void println(autoconst comment,autoconst& map){std::cout<< comment<<'{';for(constauto& pair: map)std::cout<<'{'<< pair.first<<": "<< pair.second<<'}';std::cout<<"}\n";} int main(){std::map<char,int> letter_counts{{'a',27},{'b',3},{'c',1}};     println("letter_counts initially contains: ", letter_counts);     letter_counts['b']=42;// updates an existing value    letter_counts['x']=9;// inserts a new value     println("after modifications it contains: ", letter_counts); // count the number of occurrences of each word// (the first call to operator[] initialized the counter with zero)std::map<std::string,int>  word_map;for(constauto& w:{"this","sentence","is","not","a","sentence","this","sentence","is","a","hoax"})++word_map[w];    word_map["that"];// just inserts the pair {"that", 0} for(constauto&[word, count]: word_map)std::cout<< count<<" occurrence(s) of word '"<< word<<"'\n";}

      Output:

      letter_counts initially contains: {{a: 27}{b: 3}{c: 1}}after modifications it contains: {{a: 27}{b: 42}{c: 1}{x: 9}}2 occurrence(s) of word 'a'1 occurrence(s) of word 'hoax'2 occurrence(s) of word 'is'1 occurrence(s) of word 'not'3 occurrence(s) of word 'sentence'0 occurrence(s) of word 'that'2 occurrence(s) of word 'this'

      Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      LWG 334C++98the effect of overload(1) was simply returning
      (*((insert(std::make_pair(x, T()))).first)).second
      provided its own
      description instead

      [edit]See also

      access specified element with bounds checking
      (public member function)[edit]
      inserts an element or assigns to the current element if the key already exists
      (public member function)[edit]
      inserts in-place if the key does not exist, does nothing if the key exists
      (public member function)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/container/map/operator_at&oldid=135923"

      [8]ページ先頭

      ©2009-2025 Movatter.jp