C++如何为向量中的每个元素创建一个新对象?

In C++ how can I make a new object for every element in a vector?

本文关键字:一个 新对象 对象 创建 元素 向量 C++      更新时间:2023-10-16

假设我有这个类:

class dog
{
public:
//dogstuff
private:
//secret dogstuff
};

然后我有一个函数,可以搜索不相关的东西,并得到我未知数量的狗名:

dogNamesVector = getListOfDogNames();

因此,狗名列表可能是"Spike,Spot,George,Shadow等"。

有没有一个聪明的方法可以去:

dog DOGNAME()

并获取一堆我可以调用并与狗名列表一起使用的dog对象?

所以,假设你有一个狗的向量:

vector<dog> dogs {...};

我们将假设这个载体中已经有狗。这意味着您已经拥有 dog 类型的对象,要调用它们,您需要做的就是使用括号表示法:

dogs[i];

如果要将此狗分配给另一个对象,可以使用:

dog spike = dogs[i];

如果你想要一个唯一的名称(键或标识符),你可以把它包含在类本身中,如下所示:

private:
string dog_name;

要访问它,您将创建一个成员函数(或"方法")。将这些步骤中的任何一个与某种形式的循环(任何形式的迭代都可以)结合起来,您可以根据需要创建任意数量的 dog 对象,您还可以创建一个函数来按名称搜索,如果这对您有帮助的话。

如果你有一个字符串列表,并且你的dog类可以用字符串作为输入来构造,你可以使用字符串列表的迭代器构造一个dog对象的向量,例如:

class dog
{
public:
dog(const std::string name) : m_name(name) {}
private:
std::string m_name;
};
std::vector<std::string> dogNames = getListOfDogNames();
std::vector<dog> dogs(dogNames.begin(), dogNames.end());

演示

std::vector<dog> dogs = get_dogs();
std::vector<std::string> dog_names;
dog_names.reserve(dogs.size());
std::transform(std::begin(dogs), std::end(dogs), std::back_inserter(dog_names), [](auto const& dog) { return dog.name(); });