【问题标题】:multi-dimensional vectors and pointers to vectors多维向量和指向向量的指针
【发布时间】:2013-11-21 05:07:56
【问题描述】:

我正在尝试将指向向量的指针存储在向量中。 (我希望这不会太令人难以置信)。基本上,我有一个向量,我想在其中存储多个矩阵,因此是 3 维。我访问元素的方式似乎有问题。我并不特别理解这个错误,因为第三维是一个指向整数向量的指针。我认为这不会改变您访问整数的方式。

using namespace std;

vector< vector< vector<int>* >* > matrixHolder;

int main() {

    vector< vector<int>* >* a;

    a->push_back(new vector<int>(10, 0));

    matrixHolder.push_back(a);

    matrixHolder[0][0][0] = 5; //Line 34


    return 0;
}

main.cpp:34: 错误:从‘int’到‘std::vector >*’的无效转换

【问题讨论】:

  • 我需要使用指针,因为向量需要存储在堆中。我正在从调用堆栈中收集向量,这意味着,我正在从调用堆栈上的函数中收集向量。因此,这些函数中存储的数据会在函数执行完毕时丢失。我需要在堆中捕获该数据。
  • @brettgag 为什么不能只移动数据?
  • 尝试将maxtrixholder的引用传递给函数
  • vector&lt;T&gt; 已经将其数据存储在堆上。为什么向量本身需要在堆上?

标签: c++ pointers vector


【解决方案1】:

matrixHolder[0]vector&lt;vector&lt;int&gt;*&gt;* 类型,一个指向一个指向一个整数向量的指针向量的指针。

matrixHolder[0][0] 取消引用matrixHolder[0],所以它是vector&lt;vector&lt;int&gt;*&gt; 类型,一个指向整数向量的指针向量。

matrixHolder[0][0][0] 获取matrixHolder[0][0] 的第一个元素,类型为vector&lt;int&gt;*,一个指向整数向量的指针。

所以当你这样做时:

matrixHolder[0][0][0] = 5;

错误与编译器所描述的完全一样,从 int(这就是 5)到 vector&lt;int&gt;*(这就是 matrixHolder[0][0][0])的无效转换

这个可怕的可憎的正确语法是:

(*(*matrixHolder[0])[0])[0] = 5;

或者你也可以这样做:

matrixHolder[0][0][0][0][0] = 5;

但这可能会让人混淆发生了什么,让它看起来像你有一个 5 维数组。

顺便说一句,你错了。你不需要使用指针,但我不会在这里试图说服你。

另一方面:

a->push_back(new vector<int>(10, 0));

a 是一个未初始化的指针,你只是取消了它的引用。这是未定义的行为。

【讨论】:

  • 喜欢你回答中的“可憎”这个词。
【解决方案2】:

(对于设计更完善的解决方案...)

不要使用vector&lt;vector&lt;T&gt;&gt; 来存储矩阵。通常的解决方案是单个数组(例如,vector&lt;T&gt;),使用简单的算法来计算偏移量(x + width * y 用于行主要存储):

int main() {
    constexpr int w = 10, h = 10;
    vector<vector<int>> matrixHolder(1, vector<int>(w * h, 0));
    int x = 2, y = 3;
    matrixHolder[0][x + w * y] = 5;
}

对不起 C++11 语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多