如何将空载体放入std::map
?例如,如果我有std::map<int, std::vector<int>>
,并且我希望map[4]
包含空std::vector<int>
,我可以拨打什么电话?
答案 0 :(得分:2)
如果您使用operator[](const Key&)
,地图将自动设置值初始化(即std::vector
,默认构建 )如果访问不存在的元素,则返回值。见这里:
http://en.cppreference.com/w/cpp/container/map/operator_at
(从C ++ 11开始,细节有点复杂,但在你的情况下,这才是最重要的。)
这意味着如果你的地图是空的并且你map[4]
,它会很容易地给你一个空的(默认构造的)向量的引用。分配空矢量是不必要的,尽管它可能会使您的意图更加清晰。
答案 1 :(得分:2)
不幸的是,严格正确的答案确实是使用std::piecewise_construct
作为第一个参数,然后是两个元组。第一个表示创建键(4)的参数,第二个表示创建向量的参数(空参数集)。
看起来像这样:
map.emplace(std::piecewise_construct, // signal piecewise construction
std::make_tuple(4), // key constructed from int(4)
std::make_tuple()); // value is default constructed
当然这看起来不美观,其他替代方案也可行。他们甚至可能在优化的构建中不再生成代码:
这个概念性地调用默认构造和移动分配,但优化者很可能会看到它。
map.emplace(4, std::vector<int>());
这个调用default-construction,然后是copy-assignment。但同样,优化者可能会很好地了解它。
map[4] = {};
答案 2 :(得分:1)
为确保将空矢量放置在位置4,您可以尝试{4}位置4处的矢量。
clear
正如其他人所提到的,std::map<int, std::vector<int>> my_map;
my_map[4].clear();
的索引运算符将在指定的索引处构造一个空值(如果不存在)。如果是这种情况,则调用std::map
是多余的。但是,如果clear
已经存在,则对std::vector<int>
的调用可以清除那里的向量,从而产生空向量。
这可能比我之前分配给clear
的方法更有效(见下文),因为我们可能计划在第4位向向量添加元素,而我们不会支付任何费用这种新的分配方式。此外,如果先前使用{}
表示将来使用,那么我们的新矢量最终可能会调整为与之前几乎相同的大小,这意味着我们可以节省重新分配成本。
只需分配给my_map[4]
,容器应该在那里正确构造一个空向量:
{}
编辑:正如Jodocus所提到的,如果您知道std::map<int, std::vector<int>> my_map;
my_map[4] = {};
std::cout << my_map.size() << std::endl; // prints 1
在位置4处已经包含std::map
,那么只需尝试访问该位置的向量将默认构造一,例如:
vector
答案 3 :(得分:0)
最简单的解决方案有什么问题? std::map[4] = {};
。
在现代C ++中,这应该可以做到你想要的,没有或至少,很少,开销。
如果您必须使用emplace
,我能提出的最佳解决方案是:
std::map<int, std::vector<int>> map;
map.emplace(4, std::vector<int>());
答案 4 :(得分:-1)
对std :: make_tuple使用piecewise_construct:
EditText edit = (EditText) findViewById(R.id.edit_text_id);
String text = edit.getText().toString();
我们在第4位插入一个空矢量。
如果有一般情况如下,那么填充大小为100的向量,然后填充10:
map.emplace(std::piecewise_construct, std::make_tuple(4), std::make_tuple());
map.emplace(std::piecewise_construct, std::make_tuple(4), std::make_tuple(100, 10));
:此常量值作为第一个参数传递,以构造一个对象,以选择构造函数表单,该表单通过将两个元组对象的元素转发到它们各自的构造函数来构造其成员。