在 C++ 中,如何为向量中的每个元素创建一个新对象?
Posted
技术标签:
【中文标题】在 C++ 中,如何为向量中的每个元素创建一个新对象?【英文标题】:In C++ how can I make a new object for every element in a vector? 【发布时间】:2017-03-14 21:10:53 【问题描述】:假设我有这门课:
class dog
public:
//dogstuff
private:
//secret dogstuff
;
然后我有一个函数可以搜索不相关的东西并得到一个未知数量的狗名:
dogNamesVector = getListOfDogNames();
因此,狗名列表可能类似于“Spike、Spot、George、Shadow 等”。
有没有聪明的办法呢:
dog DOGNAME()
并获得一堆dog
对象,我可以调用它们并与狗名列表一起使用?
【问题讨论】:
您可以遍历您的狗名向量并为每个名称创建一个dog
实例,可能将这些实例存储在不同的向量中。也许您正在寻找std::transform
?它迭代一个范围,将基于它的不同值添加到另一个范围。
这是个好主意!但是有什么方法可以叫他们名字吗?有点像 python 中的字典?
std::map<std::string, dog>
或 std::unordered_map<std::string, dog>
【参考方案1】:
所以,假设你有一个狗的向量:
vector<dog> dogs ...;
我们将假设这个向量中已经有狗。这意味着您已经拥有 dog 类型的对象,要调用它们,您需要做的就是使用括号表示法:
dogs[i];
如果您想将这条狗分配给另一个对象,您可以使用:
dog spike = dogs[i];
如果您想要一个唯一的名称(键或标识符),您可以将其包含在类本身中,如下所示:
private:
string dog_name;
要访问它,您需要创建一个成员函数(或“方法”)。将这些步骤中的任何一个与某种形式的循环结合起来(任何形式的迭代都可以),您可以根据需要创建尽可能多的狗对象,如果这对您有帮助,您还可以创建一个按名称搜索的函数。
【讨论】:
【参考方案2】:如果您有一个字符串列表,并且您的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());
Demo
【讨论】:
【参考方案3】: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(); );
【讨论】:
一些解释(甚至是代码中的 cmets)而不是纯代码的“答案”肯定会有用。以上是关于在 C++ 中,如何为向量中的每个元素创建一个新对象?的主要内容,如果未能解决你的问题,请参考以下文章