【问题标题】:Aliasing vector correctly正确别名向量
【发布时间】:2013-04-01 06:01:25
【问题描述】:

我无法在其他地方找到答案,所以我想我只需要问这个:我正在尝试获取一个向量的别名(其中存储了 int 指针),如下所示:

    void conversion(Engine * ENGINES) 
    {//The Engine class has a vector of int* as a public data member called SITE
        for (int i = 0; i < 3; i++)
        {
            vector <int*>* current = &(ENGINES[i].SITE);//the problematic line
            int j_max = current -> size();
            cout << j_max << endl;
            for (int j = 0; j < j_max; j++)
            {
                for (int k = 0; k < 3; k++)
                {
                     if (*current[j][k] == 2)
                    *current[j][k] = 1;
                     if (*current[j][k] == -1)
                    *current[j][k] = 0;
                }
            }
        }
    }

问题在于 *current[a][b] 的索引似乎存在反转。我希望能够将 current 用作法线向量,但现在与以下相比,索引是相反的:

vector <int*> current1 = ENGINES[1].SITE;

所以*current[i][j] = current1[j][i] 出于某种原因。我的语法有错误吗?

【问题讨论】:

  • 请张贴“SITE”声明。我怀疑你真正想要的是一个引用,而不是一个指针。这将允许编译器进行更好的优化。
  • 类引擎 { 公共:矢量 站点; }; SITE 是一个存储多个 int[3] 数组的向量
  • 我之前使用 ENGINES[ENGINE_NO].SITE.push_back(SCORES); 填充了 SITE;在一个循环中

标签: c++ templates vector alias


【解决方案1】:

正如我在评论中怀疑的那样,请使用参考。

vector <int*> &current = ENGINES[i].SITE;

【讨论】:

    【解决方案2】:

    问题在于[] 的优先级高于*(取消引用),因此*current[i][j] 被解释为*(current[i][j]),这可能不是您想要的。

    其实这个别名的习语通常用引用来表示,而不是指针:

    vector <int*>& current = ENGINES[i].SITE;
    

    只需使用current[i][j]

    【讨论】:

      【解决方案3】:

      我相信您的问题是[] 的优先级高于一元*。所以你得到的是*(current[j][k]) 而不是(*current)[j][k],这就是你想要的。

      但是,您可以通过仅获取引用而不是指针来消除该问题:

      vector &lt;int*&gt;&amp; current = (ENGINES[i].SITE);,然后在访问current 时删除额外加载的* 运算符。

      【讨论】:

      • 啊,你快了 5 秒
      • 感谢您的回答,但只是一个后续问题:为什么 *(current[i][j]) 与 (*current)[j][k] 不同?是不是和vector模板的实现方式有关系?
      • current[i]*(current + i),即它将current 视为vector&lt;int*&gt;s 的数组,并在其中采用ith 元素。是的,就是这么奇怪。
      猜你喜欢
      • 2016-04-04
      • 1970-01-01
      • 2013-10-28
      • 2021-02-10
      • 2014-05-30
      • 2019-04-25
      • 2019-04-23
      • 2016-12-09
      • 1970-01-01
      相关资源
      最近更新 更多