指向向量的 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&lt;vector&lt;int&gt; &gt;... 为什么不直接使用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&lt;T&gt;shared_ptr&lt;T&gt;?仍然不明白为什么当向量非常小时你想要一个指向向量的指针。 我们应该不创建vector 堆对象还是不应该创建指向vector 的指针?我可以创建一个堆栈对象并将其指针传递给其他函数吗?我想要一个指向vector 的指针,原因与我们想要一个指向任何其他类型的指针的原因相同。特别是联合支持指针但不支持引用。 @neckTwi:传递参考。为什么在不需要时传递指针?我并不是说永远没有这样做的充分理由,但这种情况极为罕见。我写了很多 C++ 代码,但我不能说我曾经使用过指向向量的指针或在联合中使用过向量。【参考方案3】:

你必须先为指针分配位置,然后才能开始使用它。

vector<int> *te = new vector<int>();

将此行插入到您的代码中 vector&lt;int&gt; *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++ 中的“指向对象的指针”向量访问对象

检查指向向量 C++ 中对象的指针

C++:指向向量(及其元素)的指针是不是稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制]

在 C++ 中获取指向复数向量的实部和虚部的指针

C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用

C++:使用 int 指针指向在函数内部创建的向量