【问题标题】:C++ pointer to vector指向向量的 C++ 指针
【发布时间】: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++ 的构建块之一。它应该代表它的定义。如果不是请赐教!

标签: c++ pointers vector


【解决方案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;
      }
      

      【讨论】:

        猜你喜欢
        • 2019-09-10
        • 2011-08-04
        • 2020-04-13
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 1970-01-01
        • 2017-04-27
        相关资源
        最近更新 更多