C++ 如何在std向量中推送数组

C++ 如何在std向量中推送数组,c++,vector,C++,Vector,我正在用OpenGL做一些高度图。每个顶点的唯一z存储在文件中,我还必须将x和y值存储在向量中: #include <vector> #include <fstream> #include <sstream> int main(void) { std::vector<float> _data; float constexpr triangle_side(1.118033989); std::ifs

我正在用OpenGL做一些高度图。每个顶点的唯一z存储在文件中,我还必须将x和y值存储在向量中:

#include <vector>
#include <fstream>
#include <sstream>

int main(void)
{
    std::vector<float>      _data;
    float constexpr         triangle_side(1.118033989);
    std::ifstream           ifs("mymap");
    std::string             line;

    if (not ifs.is_open())
        return -1;
    for (float y(0) ; std::getline(ifs, line) ; --y)
    {
        std::istringstream  iss(line);

        for (float x(static_cast<int>(y) % 2 ? 0 : triangle_side / 2), z ; iss >> z ; x += triangle_side)
            _data.push_back({x, y, z}); // does not compile
    }
    ifs.close();
    return 0;
}
是否保证所有值都是连续的?

使用std::vector::reserve(size\u type n)来保留备份数组至少包含n个元素。如果没有,它将重新分配一次。 在现有的向量上,如果您不仅需要“3”元素,还需要“至少3个以上”元素,那么只需使用(std::vector::size+3)调用它即可。之后,您可以安全地推回,并保证阵列不会在向量内重新分配

标准强制std::array的向量与std::vector一样是连续的。因此,std::数组的std::vector具有连续顺序的所有元素

@中国: C++03(23.2.4.1):

向量的元素是连续存储的,这意味着如果v是 一个向量,其中T是bool以外的某种类型,那么它服从 identity&v[n]==&v[0]+n对于所有0使用std::vector::reserve(size_type n)来保留备份数组至少包含n个元素。如果没有,它将重新分配一次。 在现有的向量上,如果您不仅需要“3”元素,还需要“至少3个以上”元素,那么只需使用(std::vector::size+3)调用它即可。之后,您可以安全地推回,并保证阵列不会在向量内重新分配

标准强制std::array的向量与std::vector一样是连续的。因此,std::数组的std::vector具有连续顺序的所有元素

@中国: C++03(23.2.4.1):

向量的元素是连续存储的,这意味着如果v是 一个向量,其中T是bool以外的某种类型,那么它服从 identity&v[n]==&v[0]+n表示所有0
std::array
在内存中的布局类似于一个C数组,因此
float
s将是连续的。您也可以只使用
insert

_data.insert(_data.cend(), {x, y, z});
std::array
在内存中的布局类似于C数组,因此
float
s将是连续的。您也可以只使用
insert

_data.insert(_data.cend(), {x, y, z});


如果你知道向量的最终大小,你可以
保留
@alesandropezzato我不知道,因为地图的大小不是固定的。这取决于所使用的文件。@Boiethios,好的,因此您可以使用std::array或Joachim answer(在每个循环中保留n+3个插槽),如果内存不是问题,则保留比需要更多的空间会提高性能,尤其是在这种情况下。@Alessandropezato内存始终是个问题。计算速度仍然遵循摩尔定律,内存速度没有也永远不会。如果你知道向量的最终大小,你可以
保留
@AlessandroPezzato我不知道,因为地图的大小不是固定的。这取决于所使用的文件。@Boiethios,好的,因此您可以使用std::array或Joachim answer(在每个循环中保留n+3个插槽),如果内存不是问题,则保留比需要更多的空间会提高性能,尤其是在这种情况下。@Alessandropezato内存始终是个问题。计算速度仍然遵循摩尔定律,内存速度从未也永远不会。好的,谢谢。所以我将使用第二种解决方案。我有点害怕使用一个容器的容器。我想这可能会导致一些我无法理解的混乱…它可以,但是内存保证在那里。好的,谢谢。所以我将使用第二种解决方案。我有点害怕使用一个容器的容器。我想这会导致一些我无法理解的混乱…可以,但记忆保证就在那里。哇,这太酷了。我查看了
stl\u vector.h
并看到:
iterator insert(const\u iterator\u位置,initializer\u list\u l)
这是一个很好的解决方案,我想知道该标准怎么可能没有一个
无效的push\u back(initializer\u list\u l)
@Boiethios您将来应该向cppreference.com查询。这比浏览头文件容易得多。查看emplace_back@Alessandropezato
emplace_back
不接受初始值设定项列表
emplace_back
不会尝试插入3个
float
s。它将尝试从三个参数构造一个
float
,并插入它,这是不可能的。哇,这太酷了。我查看了
stl\u vector.h
并看到:
iterator insert(const\u iterator\u位置,initializer\u list\u l)
这是一个很好的解决方案,我想知道该标准怎么可能没有一个
无效的push\u back(initializer\u list\u l)
@Boiethios您将来应该向cppreference.com查询。这比浏览头文件容易得多。查看emplace_back@Alessandropezato
emplace_back
不接受初始值设定项列表
emplace_back
不会尝试插入3个
float
s。它将尝试从三个参数构造一个
float
,并插入它,这是不可能的。