C++指向向量的指针

4
我需要将元素插入到指向向量的指针中。我编写了以下代码,但是它给出了分段错误。请问有哪些错误或者我们可以采用其他方式实现这个功能。
int main()
{
     vector<int> *te;
     te->push_back(10);
     cout<<te->size()<<endl;
     return 0;
 }

6
为什么需要指向向量的指针?也许如果我们知道背后的动机,就能更好地帮助你。 - Alok Save
3
你为什么不直接使用智能指针来指向一个 vector 呢?比如 shared_ptr<vector<int>>... - enobayram
@AlokSave 我们需要一个指向向量的指针,因为指针是 C++ 的构建块之一。它应该代表它的定义。如果不是,请启发我! - Necktwi
@neckTwi:仅仅因为一种编程语言提供了某个特性并不意味着你必须使用它。你需要选择一个适合完成工作的特性。这更像是马术比赛,没有充分的理由使用某个特性是不可接受的。OP展示的代码片段不需要使用指向向量的指针,一个简单的向量就足够了,这也是我的评论所在。至于启发你,请随意通过阅读好书来自我启发。此外,如果你需要问这个问题,你必须这样做。 - Alok Save
@AlokSave 是的,我正在了解RAII,但是有一个参考点来构建东西确实很激进 :) stackoverflow的积分比Facebook的赞更有价值 :) - Necktwi
显示剩余4条评论
5个回答

19
你从未分配向量:
vector<int> *te  = new vector<int>;

另外,您不需要动态分配。一种更简洁的方法是使用自动存储:

int main()
{
     vector<int> te;
     te.push_back(10);
     cout<<te.size()<<endl;
     return 0;
}

1
谢谢!实际上我需要实现一个简单的C++模板类,用于管理指向向量的智能指针。你能否建议我如何做到这一点? - Mukesh

10
 vector<int> *te;
 te->push_back(10);

你声明了一个指向 vector 的指针;但是你还没有将它初始化为指向有效的内存。你需要使用 new 构造一个新的 vector。
vector<int> *te = new vector<int>();

然而,你不应该这样做。保留指向向量的指针有很少的理由,并且你刚刚使它完全无法有效地管理自己的内部存储。

了解一下RAII。这是一种通过对象的生命周期来管理动态分配内存的技术。 vector使用此方法在其作用域结束时清除其内部动态分配的存储。

保留对向量的指针会阻止它正确工作,依赖于你自己调用delete,从而从一开始使用vector获得的主要好处中削弱了一个重要的好处,即不需要使用数组。


@neckTwi: 像unique_ptr<T>或者shared_ptr<T>这样的吗?还是不明白为什么你想要一个指向vector的指针,因为vector本身就很小。 - Ed S.
我们应该不创建一个 vector 堆对象,还是不应该创建一个指向 vector 的指针?我可以创建一个栈对象并将其指针传递给其他函数吗?我想要一个指向 vector 的指针,原因与我们想要任何其他类型的指针相同。特别是联合支持指针但不支持引用。 - Necktwi
@neckTwi:传递一个引用。为什么不需要时要传递指针?我并不是说永远没有好的理由这样做,但这种情况极其罕见。我写了很多C++代码,我不能说我曾经拿过一个向量的指针或在联合中使用过一个向量。 - Ed S.

1

完成@eday的解决方案以访问元素

vector<int> foo={1,2,3,4,5};
vector<int> * te=&foo;
te->push_back(6);

cout << (*te)[2] << endl; // > 3 

1

在开始使用指针之前,您必须先为指针分配空间。

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.

0
你的问题是创建了一个指向vector的指针,但并没有创建vector来指向它。这里有一个小例子,你可以创建一个vector,然后使用指针对其进行操作,最后检查原始vector以查看结果:
#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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接