标签: stdmap

移动 std::map 与移动 std::map 的所有元素

std::map<int, Obj> mp;
// insert elements into mp

// case 1
std::map<int, Obj> mp2;
mp2 = std::move(mp);

// case 2
std::map<int, Obj> mp3;
std::move(std::begin(mp), std::end(mp), std::inserter(mp3, std::end(mp3));
Run Code Online (Sandbox Code Playgroud)

我对这两个案例感到困惑。它们完全一样吗?

c++ move stdmap std c++11

5
推荐指数
2
解决办法
408
查看次数

对于std :: map,如果必须调整容器大小并且内存不可用,插入的行为方式如何?

对于std :: map,如果必须调整容器大小并且内存不可用,插入的行为方式如何?

insert stdmap

4
推荐指数
1
解决办法
2689
查看次数

在关联容器中使用emplace(args && ...)

我试图转发一些参数来进行对象的原位构造.我不太了解在关联容器中使用emplace背后的基本原理,或者我可能只是以错误的方式使用/思考.如果有人可以共享代码片段以供使用,那将会很棒.

像map这样的关联容器总是存储一个kind对()的对象,而emplace函数表示它会通过转发参数来调用存储的对象的构造函数(对于map的情况总是成对).那么即使函数具有可变参数签名,我们是否仅限于提供两个参数(键,值)?

当我使用增强容器的emplace之前我可以传递如下的参数:emplace(arg1,arg2,arg3,arg4)//其中arg2,arg3,arg4用于构造对象而arg 1是关键.

当用新的gcc-4.6和c ++ 11编译时,这会打破但现在我必须做类似的事情:emplace(arg1,myobj(arg2,arg3,arg4)); //使相同的代码工作;

所以新的安卓不会像升级那样做任何明智的结构吗?我是否限制只为地图提供2个参数,因为对将始终为其构造函数接受两个参数.

c++ stdmap variadic-templates c++11 std-pair

4
推荐指数
2
解决办法
1388
查看次数

如何在值为 std::set(从某物映射到集合)的 std::map 中使用 emplace()?

问题

我有一个std::map<int, std::set<int>>名为misi. 我想知道为什么misi.emplace(2345, {6, 9});并且misi.emplace({2345, {6, 9}});没有按预期工作,如下所示。

编码

#include <set>          // std:set
#include <map>          // std::map
#include <utility>      // std::piecewise_construct, std::pair
#include <tuple>        // std::forward_as_tuple
#include <iostream>     // std::cout, std::endl

int main()
{
    // --- std::set initializer list constructor ---
    std::set<int> si({42, 16});
    std::cout << "si.size(): " << si.size() << std::endl;       // 2
    std::cout << "*si.begin(): " << *si.begin() << std::endl;   // 16

    // --- std::set emplace() ---
    si.emplace(7);
    std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ stdmap stdset c++11 emplace

4
推荐指数
1
解决办法
2237
查看次数

c ++ std::map 获取最高键低于 X 的元素?

给定一个键是整数的 C++ 映射(或多映射),是否可以使用 STL 请求键是给定数字以下最大数字的元素范围?

所以如果我有:

map = {{1,'x'}, {2, 'g'}, {3, 'n'}, {3, 'm'}, {4, 'z'}, {5, 'a'}}
Run Code Online (Sandbox Code Playgroud)

我想在 4 之前找到元素,它会返回:

{{3, 'n'}, {3, 'm'}}
Run Code Online (Sandbox Code Playgroud)

(我更感兴趣,std::map但也保留了一般问题std::multimap)。

c++ stl stdmap c++11

4
推荐指数
2
解决办法
1422
查看次数

std::forward_as__tuple 的用例

Cppreference 给出std::forward_as_tuple了以下示例(请参见此处

#include <iostream>
#include <map>
#include <tuple>
#include <string>

int main()
{
     std::map<int, std::string> m;

     m.emplace(std::piecewise_construct,
               std::forward_as_tuple(10),
               std::forward_as_tuple(20, 'a'));
     std::cout << "m[10] = " << m[10] << '\n';

     // The following is an error: it produces a
     // std::tuple<int&&, char&&> holding two dangling references.
     //
     // auto t = std::forward_as_tuple(20, 'a');
     // m.emplace(std::piecewise_construct, std::forward_as_tuple(10), t);
}
Run Code Online (Sandbox Code Playgroud)

简单写有什么好处

 m.emplace(std::make_pair(20,std::string(20,'a')));
Run Code Online (Sandbox Code Playgroud)

c++ stdmap std c++11

4
推荐指数
1
解决办法
211
查看次数

map 是否将元素存储为 std::pair?

std::map 是否将元素存储为std::pair?迭代地图看起来像这样:

#include <map>
int main() {
    std::map<int, char> m;
    m[1] = 'A';
    m[2] = 'B';
    m[3] = 'C';

    std::map<int, char>::iterator it;
    for(it = m.begin(); it != m.end(); it++)
    {
       std::cout << "Key: "    << it->first;
       std::cout << " Value: " << it->second;
       std::cout << std::endl;
    } 
}
Run Code Online (Sandbox Code Playgroud)

c++ internals stdmap std-pair

4
推荐指数
1
解决办法
518
查看次数

一对数组而不是 STL 映射 - 可能吗?优缺点都有什么?

为什么 c++ 标准映射非常有名,而成对数组也与那些相似?

什么时候使用 C++ 标准映射更好,什么时候使用成对数组?或者两者的应用程序相似?

c++ arrays stdmap c++-standard-library data-structures

4
推荐指数
1
解决办法
382
查看次数

C++20 中是否有assign_or_inserter/insert_or_assigner?

std::inserter 遇到的问题是,如果键已经存在,它会调用 map 的 insert 为 noop。有std::map::insert_or_assign,但我找不到使用它的插入器。

C ++ 20中有这样的东西吗?

注意:我知道我可以从 SO/互联网上的某个地方 c/p 它,我对 STL/boost 解决方案感兴趣,而不是从某个地方的 c/p 实现。

c++ stdmap c++20

4
推荐指数
1
解决办法
122
查看次数

使用 operator[] 插入时不同的 std::map 大小(vc++ vs g++)

这段代码

#include <iostream>
#include <map>

int main()
{
    std::map<int, std::size_t> m;
    m[0] = m.size();
    std::cout << m[0] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

将打印0VC ++1G ++

  • 这个代码有效吗?
  • 如果是,哪个编译器是正确的?
  • 直觉上我会期待1。vc++ 的结局如何0

c++ gcc stdmap visual-c++ language-lawyer

4
推荐指数
1
解决办法
107
查看次数