13

我有这个奇怪的问题

    vector<unsigned int[3]> tris;
    for (unsigned int i = 0; i < idx.size() - 2; i++) {
        unsigned int push[] = {idx[i], idx[i+1], idx[i+2]};
        tris.push_back(push); //<- this is where it goes belly up
    }

该代码段应该将三角形带状索引列表分解为三角形索引,但不会在 vs10 下编译。想法?

4

3 回答 3

23

不,除非您将数组包装成 astruct或使用类似std::array.

裸 C 样式数组类型不可复制或分配,这使得它没有资格用作标准容器元素。

PS 应该注意的是,尽管 C++11 切换到更精细的(按方法)方法来指定容器元素类型的要求,而不是 C++03 使用的更广泛的方法。上述不合格声明基于 C++03。我还没有准备好说它对于 C++11 也是如此无条件地正确......但如果你坚持在push_back代码中使用它,即使在 C++11 中它也肯定是正确的。

PPS 在 C++11 中,人们可能会摆脱std::list裸 C 风格的数组并使用emplace它来构造新元素。但不与std::vector.

于 2013-06-06T19:33:39.120 回答
12

改为使用std::vector<std::array<unsigned, 3>>

于 2013-06-06T19:33:33.000 回答
0

如果您使用的是 C++11,则可以使用元组。

std::vector < std::tuple< unsigned int, unsigned int, unsigned int > > tris;

https://stackoverflow.com/a/15734156/846686

一个不太“优雅”的解决方案可以是一对一对

    std::vector < std::pair< unsigned int, std::pair<unsigned int, unsigned int> > tris;

但这可能会导致阅读代码非常混乱...

于 2016-12-30T14:21:18.270 回答