将空元素添加到已声明的容器中而不声明元素的类型

Vin*_*eet 15 c++ c++11

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

std::vector<std::map<std::string, std::set<std::string>>> table;
Run Code Online (Sandbox Code Playgroud)

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

table.push_back(std::map<std::string, std::set<std::string>>());
Run Code Online (Sandbox Code Playgroud)

有什么方法可以避免重新声明类型,而只需添加正确的类型化元素?

Vin*_*eet 33

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

table.emplace_back();
Run Code Online (Sandbox Code Playgroud)


son*_*yao 24

您可以利用copy-list-initialization(从C ++ 11开始)并编写

table.push_back({});
Run Code Online (Sandbox Code Playgroud)


650*_*502 10

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


Lig*_*ica 5

尽管其他答案是正确的,但我将补充一点,如果您不能采用这种方法,则可以从声明一些类型别名以缩短该容器类型名称中受益。

我当然只能猜测您容器的逻辑含义,这是可以解决的另一件事!

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

 std::vector<NeighbourMapType> table;
 table.push_back(NeighbourMapType());
Run Code Online (Sandbox Code Playgroud)

我提到这一点是因为您可能仍然可以在其他地方从中受益。

  • 同意 STL为您提供的类型也一样(vector :: value_type iirc) (2认同)