当我们在C ++中使用复杂的容器时,例如
std::vector<std::map<std::string, std::set<std::string>>> table;
添加空映射(可能表示行或列)的唯一方法是初始化新元素并将其推回。例如,
table.push_back(std::map<std::string, std::set<std::string>>());
有什么方法可以避免重新声明类型,而只需添加正确的类型化元素?
答案 0 :(得分:33)
后来,我从CLion的IntelliSense中发现一种有用的方法是emplace_back()
。这将构造一个正确类型的新对象,并将其添加到向量的末尾。
table.emplace_back();
答案 1 :(得分:24)
您可以利用copy-list-initialization(自C ++ 11起)进行编写
table.push_back({});
答案 2 :(得分:10)
在C ++ 11之前,有时我使用x.resize(x.size()+1)
,在C ++ 11或更高版本中,您可以使用x.push_back({})
。
答案 3 :(得分:5)
尽管其他答案是正确的,但我会添加如果如果您不能采用这种方法,则可以通过声明一些类型别名来缩短该容器类型名称而受益。
我当然只能猜测您容器的逻辑含义,这是可以解决的另一件事!
using PhilosopherNameType = std::string;
using NeighboursType = std::set<PhilosopherNameType>;
using NeighbourMapType = std::map<PhilosopherNameType, NeighboursType>;
std::vector<NeighbourMapType> table;
table.push_back(NeighbourMapType());
我之所以提及这一点,是因为您可能仍然可以在其他地方从中受益。