指向向量的 C++ 指针
Posted
技术标签:
【中文标题】指向向量的 C++ 指针【英文标题】:C++ pointer to vector 【发布时间】:2012-04-01 09:48:30 【问题描述】:我必须将元素插入指向向量的指针中。我编写了以下代码,但它给出了分段错误。有人可以指出此代码中的错误是什么,或者我们该如何做。
int main()
vector<int> *te;
te->push_back(10);
cout<<te->size()<<endl;
return 0;
【问题讨论】:
为什么需要一个指向向量的指针?如果我们知道这背后的动机,也许我们可以提供更好的帮助。 实际上我必须实现一个简单的 C++ 模板类来管理一个指向向量的智能指针。你能建议我怎么做吗? 那你为什么不简单地使用一个指向向量的智能指针呢? IE。shared_ptr<vector<int> >
...
为什么不直接使用shared_ptr
原样?您坚持定义自己的班级使我推断这是一个家庭作业问题。
@AlokSave 我们需要一个指向向量的指针,因为指针是 C++ 的构建块之一。它应该代表它的定义。如果不是请赐教!
【参考方案1】:
你永远不会分配向量:
vector<int> *te = new vector<int>;
另外,您不需要动态分配。更简洁的方法是使用自动存储:
int main()
vector<int> te;
te.push_back(10);
cout<<te.size()<<endl;
return 0;
【讨论】:
谢谢!!实际上我必须实现一个简单的 C++ 模板类来管理指向向量的智能指针。你能建议我怎么做吗?【参考方案2】: vector<int> *te;
te->push_back(10);
你已经声明了一个指向vector
的指针;您尚未将其初始化为指向有效的内存。您需要使用new
构造一个新向量。
vector<int> *te = new vector<int>();
但是,您不应该这样做。维护指向向量的指针的理由很少,而您只是让它在管理自己的内部内存方面完全无效。
阅读一点关于RAII 的信息。这是一种用于通过对象的生命周期管理动态分配的内存的技术。 vector
使用此方法在超出范围时清理其内部动态分配的存储。
维护一个指向向量的指针会阻止它正常工作,依赖于你自己调用delete
,基本上抵消了首先使用vector
而不是数组的一个主要好处。
【讨论】:
@neckTwi:喜欢unique_ptr<T>
或shared_ptr<T>
?仍然不明白为什么当向量非常小时你想要一个指向向量的指针。
我们应该不创建vector
堆对象还是不应该创建指向vector
的指针?我可以创建一个堆栈对象并将其指针传递给其他函数吗?我想要一个指向vector
的指针,原因与我们想要一个指向任何其他类型的指针的原因相同。特别是联合支持指针但不支持引用。
@neckTwi:传递参考。为什么在不需要时传递指针?我并不是说永远没有这样做的充分理由,但这种情况极为罕见。我写了很多 C++ 代码,但我不能说我曾经使用过指向向量的指针或在联合中使用过向量。【参考方案3】:
你必须先为指针分配位置,然后才能开始使用它。
vector<int> *te = new vector<int>();
将此行插入到您的代码中 vector<int> *te;
之后
注意
如果您要尝试使用指针访问已定义的向量,则不必为指针分配位置。
例如;
vector<int> foo=1,2,3,4,5;
vector<int> * te=&foo;
te->push_back(6); // its legal.
【讨论】:
【参考方案4】:完成@eday 访问元素的解决方案
vector<int> foo=1,2,3,4,5;
vector<int> * te=&foo;
te->push_back(6);
cout << (*te)[2] << endl; // > 3
【讨论】:
【参考方案5】:您的问题是您创建了一个指向向量的指针,而没有创建它指向的向量。这是一个小例子,您创建一个向量,然后使用指针对其执行操作,然后检查原始向量以查看结果:
#include <iostream>
#include <vector>
using namespace std;
int main()
vector<int> myvector;
vector<int>* te = &myvector;
int N = 5;
for(int i = 0; i < N; i++)
te->push_back(N - i);
cout<<"te->size() "<<te->size()<<endl;
for(int i = 0; i < N; i++)
cout<<"myvector["<<i<<"] = "<<myvector[i]<<endl;
return 0;
【讨论】:
以上是关于指向向量的 C++ 指针的主要内容,如果未能解决你的问题,请参考以下文章
C++:指向向量(及其元素)的指针是不是稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制]