在不声明元素类型的情况下将空元素添加到声明的容器中

问题描述 投票:15回答:4

当我们在C ++中使用复杂的容器时,就像

std::vector<std::map<std::string, std::set<std::string>>> table;

添加空映射(可能表示行或列)的唯一方法是初始化新元素并将其推回。例如用

table.push_back(std::map<std::string, std::set<std::string>>());

有没有办法避免重新声明类型,只是添加正确的类型元素?

c++ c++11
4个回答
33
投票

从CLion的IntelliSense,我后来发现一个有用的方法是emplace_back()。这构造了一个正确类型的新对象,并将其添加到向量的末尾。

table.emplace_back();

24
投票

您可以利用copy-list-initialization(自C ++ 11以来)并撰写

table.push_back({});

10
投票

在C ++ 11之前,我有时会使用x.resize(x.size()+1),在C ++ 11或更高版本中你可以使用x.push_back({})


5
投票

虽然其他答案是正确的,但我会补充一点,如果你不能采用这种方法,你可以从声明一些类型别名来缩短容器类型名称。

我当然只能猜测你的容器的逻辑含义,这是另一个修复的东西!

 using PhilosopherNameType = std::string;
 using NeighboursType      = std::set<PhilosopherNameType>;
 using NeighbourMapType    = std::map<PhilosopherNameType, NeighboursType>;

 std::vector<NeighbourMapType> table;
 table.push_back(NeighbourMapType());

我之所以提到这一点,是因为你可能仍然可以从其他地方受益。

© www.soinside.com 2019 - 2024. All rights reserved.