【问题标题】:problems initializing a vector of vectors of an auto-inc type初始化 auto-inc 类型向量的问题
【发布时间】:2014-06-16 12:19:23
【问题描述】:

我正在尝试使用具有升序的单元格生成一个二次网格。

#include <iostream>
#include <vector>

class Simple
{
public:
    Simple(): id(genId()) {}
    static int genId()
    {
        static int g_id = 0;
        return ++g_id;
    }
    int id;
};

typedef std::vector< std::vector<Simple> > SimpleGrid;

void printSimpleGrid(SimpleGrid& grid)
{
    for(int i = 0; i < grid.size(); i++) {
        for(int j = 0; j < grid[i].size(); j++) {
            std::cout << grid[i][j].id << " ";
        }
        std::cout << std::endl;
    }
}

int main()
{
    int dim = 3;
    SimpleGrid test(dim);
    for (int i=0; i<dim; i++) {
        std::vector<Simple> row(dim);
        test[i] = row;
    }
    printSimpleGrid(test);
    return 0;
}

我得到这个输出:

1 1 1
2 2 2
3 3 3

这与我的预期不同:

1 2 3
4 5 6
7 8 9

我做错了什么?

(我使用的是 Code::Blocks 12.11 rev 8629 和 SDK 版本 1.13.14)

【问题讨论】:

  • 你确定吗?因为我得到了正确的结果coliru.stacked-crooked.com/a/ba4517515949b7db
  • @40two 是的,我只是复制粘贴了它。也许这只是我的 SDK 版本中的一个错误。 ...感谢 Coliru 的提醒 :)
  • 可能是因为我用 VC++2013 也得到了正确的结果。
  • 看起来向量的构造函数的实现就像创建默认构造的对象并用它的副本填充向量。请注意,此行为是正确的:cplusplus.com/reference/vector/vector/vector
  • 我的错,这种行为是 c++98 特有的,c++11 应该适合你。

标签: c++ c++11 vector codeblocks c++03


【解决方案1】:

旧版/C++03 编译器会看到这个...

std::vector<Simple> row(dim);

...并将其与构造函数的重载相匹配...

explicit vector( size_type count,
             const T& value = T(),
             const Allocator& alloc = Allocator());

...为第二个构造函数参数创建一个原型 Simple 对象,然后将其复制到每个 dim 向量元素。

较新的/C++11 编译器将改为匹配此重载...

explicit vector( size_type count );

...然后继续调用构造函数dim 次以创建元素。

详情here

【讨论】:

    【解决方案2】:

    除了Tony D's great answer,下面是我的happy end。在 IDE 设置中,我为编译器启用了 C++11 合规性。 Code::Blocks 12.11 包显然不仅支持一种标准:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多