c ++ преобразует матрицу в вектор указателя строки - PullRequest
2 голосов
/ 10 октября 2010
vector<vector<int> > mymatrix;
vector<int> *ptr_vec;

Как заставить ptr_vec указывать на векторы, которые находятся внутри mymatrix один за другим. Более подробно: скажем, mymatrix.at(0).size() дает 10, а mymatrix.at(1).size() дает 14 .. если я иду ptr_vec->at(15), это должно дать мне пятого члена в mymatrix.at(1) надеюсь, это никого не смущает.

Хорошо, теперь, когда я показал точку зрения, представьте, что mymatrix - это разделенные векторы vector<int> row1, row2, row3; что может быть еще проще, как заставить этот ptr иметь все адреса каких-либо других векторов ??

Ответы [ 3 ]

1 голос
/ 10 октября 2010

Учитывая ваше пояснение "как сделать так, чтобы в 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;
}

Приветствия & hth.,

- Альф

1 голос
/ 10 октября 2010

Вам придется вручную пройтись по матрице, чтобы построить вектор:

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));
  }
}

Я думаю, что вы хотите, это невозможно, потому что ваша матрица не существует как непрерывный блок целых чисел, этоблок векторов, каждый из которых указывает на другую ячейку памяти для каждой строки.

0 голосов
/ 10 октября 2010

Вы можете использовать std::vector<T>::pointer:

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

Теперь вы можете использовать ptr, использовать арифметику указателей и т. Д., Как и любой указатель.

Для получения дополнительной информации см., Например, 1009 * MSDN *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...