【问题标题】:c++ convert matrix into row pointer vectorc ++将矩阵转换为行指针向量
【发布时间】:2010-10-10 02:14:49
【问题描述】:
vector<vector<int> > mymatrix;
vector<int> *ptr_vec;

如何使ptr_vec 指向 mymatrix 中一个接一个的向量。更详细地说,假设 mymatrix.at(0).size() 给出 10,mymatrix.at(1).size() 给出 14 ..如果我去 ptr_vec-&gt;at(15) 它应该给我 mymatrix.at(1) 中的第五个成员希望它不会混淆任何人。

好的,现在我已经说明了这一点,将 mymatrix 视为像这样的分离向量 vector&lt;int&gt; row1, row2, row3; 这可能更简单,如何使该 ptr 具有其他向量的所有地址??

【问题讨论】:

    标签: c++ pointers matrix vector


    【解决方案1】:

    鉴于您的说明“如何使该 ptr 具有其他向量的所有地址”,我认为您在声明中错误地放置了 *

    它认为您的意思是 ptr_vec 是一个指针向量。

    如果是这样,...

    #include <iostream>
    #include <vector>
    #include <stddef.h>
    using namespace std;
    
    typedef ptrdiff_t Size;
    
    template< class Elem >
    Size countOf( vector< Elem > const& v ) { return v.size(); }
    
    int main()
    {
        vector< vector<int> >   mymatrix( 10, vector<int>( 14 ) );
        vector<int*>            ptr_vec;
    
        for( Size i = 0;  i < countOf( mymatrix );  ++i )
        {
            vector<int>&    v   = mymatrix[i];
    
            for( Size j = 0;  j < countOf( v );  ++j )
            {
                ptr_vec.push_back( &v[j] );
            }
        }
    
        // Init data
        for( Size i = 0;  i < countOf( mymatrix );  ++i )
        {
            vector<int>&    v   = mymatrix[i];
    
            for( Size j = 0;  j < countOf( v );  ++j )
            {
                v[j] = 100*i + j + 1;
            }
        }
    
        // Display
        for( Size i = 0;  i < countOf( ptr_vec );  ++i )
        {
            cout << *ptr_vec[i] << ' ';
        }
        cout << endl;
    }
    

    干杯,

    --阿尔夫

    【讨论】:

    • 哇,你付出了太多的努力,真的非常感谢!是的,你是对的 * 运算符应该是 int* 现在它将是一个指针向量,我可以为它分配我想要的任何东西
    【解决方案2】:

    您必须手动遍历矩阵来构造向量:

    vector<int> *ptr_vec = new vector<int>;
    for (int j=0;j<mymatrix.size();j++) {
      for (int k=0;k<mymatrix[j].size();k++) {
        vec->push_back(mymatrix.at(j).at(k));
      }
    }
    

    我认为你想要的是不可能的,因为你的矩阵不作为一个连续的整数块存在,它是一个向量块,每个向量都指向每一行的另一个内存位置。

    【讨论】:

    • 我不介意循环它们,迭代器能解决问题吗?如果我有一个迭代器向量以相同的方式执行并循环?
    • 在那种情况下,他甚至不需要做一个“新”,只要一个vector&lt;int&gt; vec;就足够了。
    【解决方案3】:

    你可以使用std::vector&lt;T&gt;::pointer:

    vector<vector<int> > mymatrix;
    vector<vector<int> >::pointer ptr = &mymatrix[0];
    

    您现在可以像任何指针一样尊重ptr、使用指针算术等。

    有关详细信息,请参阅例如MSDN.

    【讨论】:

      猜你喜欢
      • 2016-08-07
      • 2018-11-18
      • 1970-01-01
      • 2016-05-10
      • 2016-04-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 2013-01-05
      相关资源
      最近更新 更多