gpt4 book ai didi

c++ - 指针 vector 调整大小

转载 作者:行者123 更新时间:2023-11-28 07:03:11 25 4
gpt4 key购买 nike

在编写我的 CFD 代码时,我遇到了指针 vector 的问题。我将其分解为以下代码,代表了核心问题:

#include <iostream>
#include <vector>
#include <memory>

class MyClass{
public:
MyClass() {}
MyClass(int i) {_myVec.push_back(i);}
~MyClass() {_myVec.clear();}
const std::vector<int> myVec() const {return _myVec;}
std::vector<int> _myVec;
private:
};


int main(){
std::size_t size = 3;
std::vector< std::shared_ptr<MyClass> > myClass;
// add some elements with push_back
for(auto i = 0; i < size; i++){
myClass.push_back(std::shared_ptr<MyClass>(new MyClass()));
}
for(auto i = 0; i < size; i++){
myClass[i]->_myVec.push_back(i);
}
// print
for(auto i = 0; i < size; i++){
for(auto j = 0; j < myClass[i]->myVec().size(); j++){
std::cout << myClass[i]->myVec()[j] << " ";
}
std::cout << std::endl;
}
std::cout << std::endl;
myClass.clear();


// add some elements with resize
myClass.resize(size, std::shared_ptr<MyClass>(new MyClass()));
for(auto i = 0; i < size; i++){
myClass[i]->_myVec.push_back(i);
}
//print
for(auto i = 0; i < size; i++){
for(auto j = 0; j < myClass[i]->myVec().size(); j++){
std::cout << myClass[i]->myVec()[j] << " ";
}
std::cout << std::endl;
}
myClass.clear();
}

这段代码的输出如下。

0
1
2

0 1 2
0 1 2
0 1 2

第一部分正是我所期望的。第二部分是,让我吃惊的地方。 resize 函数显然首先构建类,然后将 vector 中的所有指针引用到这个类,而不是我认为 vector::resize 会做的事情,即为每个元素调用 new 运算符,以便 vector 中的每个元素都指向到它自己的对象。我真的不觉得这种行为直观和合乎逻辑,如果我想在每个 vector 元素上都有相同的指针,我会这样写告诉编译器:

std::shared_ptr<MyClass> myTempclass = std::shared_ptr<MyClass>(new MyClass())
for(auto i = 0; i < size; i++){
myClass.push_back(myTempclass);
}

有人能解释一下为什么 vector 在这种特定情况下会这样吗,或者有一个指向好的站点的链接(c++ 引用站点没有帮助我解释它)?

最佳答案

The resize function obviously first builds the class and than referes all pointers in the vector to this one class

实际上,不,事实并非如此。 在编写 std::shared_ptr<MyClass>(new MyClass()) 时构建了类(和共享指针)在通话中。 resize 只是接受结果参数并用它来执行它的逻辑。

resize 的逻辑是通过复制 参数来创建任何必要的新值。复制 shared_ptr 会创建指向同一事物的新指针对象。这样就会导致您看到的结果。

就好像你写过:

std::shared_ptr<MyClass> ptr(new MyClass());
for(auto i = 0; i < size; i++)
{
myClass.push_back(ptr);
}

关于c++ - 指针 vector 调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22137976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com