如何在STL列表中存储数组? 使用C++和STL,有人知道如何将整数数组存储为STL列表或向量中的节点吗?我有一对未知的数字需要存储,来自其他语言,我的第一个想法是使用某种类似列表或向量的数据结构。。。但是我遇到了一些麻烦。我确信100%是我正在做一个明显的初学者的C++错误,而一个真正懂语言的人会看一眼我正在做的事情,并且能够让我直截了当。

如何在STL列表中存储数组? 使用C++和STL,有人知道如何将整数数组存储为STL列表或向量中的节点吗?我有一对未知的数字需要存储,来自其他语言,我的第一个想法是使用某种类似列表或向量的数据结构。。。但是我遇到了一些麻烦。我确信100%是我正在做一个明显的初学者的C++错误,而一个真正懂语言的人会看一眼我正在做的事情,并且能够让我直截了当。,c++,arrays,stl,C++,Arrays,Stl,所以,我已经试过了。像这样声明列表很有效: stl::list<int[2]> my_list; 这可以编译并运行得很好。但是,只要我尝试将foo添加到我的列表中,如下所示: int foo[2] = {1,2}; my_list.push_back(foo); 我得到了一整套编译器错误,其中没有一个我真正理解(我的C++-fu几乎不存在): /usr/include/c++/4.0.0/ext/new_allocator.h:在成员函数'void\u gnu\u cxx::n

所以,我已经试过了。像这样声明列表很有效:

stl::list<int[2]> my_list;
这可以编译并运行得很好。但是,只要我尝试将
foo
添加到我的列表中,如下所示:

int foo[2] = {1,2};
my_list.push_back(foo);
我得到了一整套编译器错误,其中没有一个我真正理解(我的C++-fu几乎不存在):

/usr/include/c++/4.0.0/ext/new_allocator.h:在成员函数'void\u gnu\u cxx::new_allocator::construct(_Tp*,const\u Tp&)[带_Tp=int[2]]:
/usr/include/c++/4.0.0/bits/stl_list.h:440:从“std::_list_node*std::list:::_M_create_node(const _Tp&)[带_Tp=int[2],_Alloc=std::allocator]”实例化
/usr/include/c++/4.0.0/bits/stl_list.h:1151:从“void std::list::_M_insert(std::_list_iterator,const _Tp&)[带_Tp=int[2],_Alloc=std::allocator]”实例化
/usr/include/c++/4.0.0/bits/stl_list.h:773:从“void std::list::push_back(const _Tp&)[with _Tp=int[2],_Alloc=std::allocator]实例化
test.cpp:5:从此处实例化
/Ur/Cu/C++ +4.0.0/Ext/NexIApLoaltC.H:104:错误:ISO C++禁止数组新的初始化

有人知道我做错了什么吗?任何指针(没有双关语)都会非常有用。难道不能将数组存储在std::list中吗?我应该使用struct吗?我只是缺少了一个
*
&
吗?

存储在标准库容器中的东西必须是可分配和可复制的-数组两者都不是。最好的方法是创建std::vector的列表。或者,可以将数组包装到结构中:

struct A {
   int array[2];
};

std::list <A> alist;
结构A{ int数组[2]; }; 列表列表;
不能将数组存储在STL容器中。对于一般情况,可以使用向量向量或类似的向量。对于您的特定情况,我将使用std::pair的向量,如下所示:
std::vector
std::pair
是一个具有两个成员的类,
first
second
,无论您将其模板化为何种类型


编辑:我最初将其命名为
std::vector
,但我不确定它是否重载为在两种类型相同的情况下只接受1个参数。。。稍微挖掘一下,没有发现这方面的证据,所以我对它进行了修改,明确指出
first
second
都是
int
s.

这是一个很好的情况,可以使用它来代替“经典的”C样式数组。 这应该起作用:

std::list<boost::array<int,2> > my_list;
boost::array<int,2> foo={{1,2}};
my_list.push_back(foo);
std::列出我的清单;
数组foo={{1,2};
我的清单。推回(foo);

在这种情况下,我建议您使用std::pair来存储值。它位于


您可以在列表中存储指向数组的指针,但随后必须处理所有内存管理。如果您只需要一对值,那么使用pair就简单多了

从C++11开始,我们可以使用标准的
std::array

#include <array>
#include <list>
#include <iostream>

int main () {
    std::list<std::array<int, 2>> l {{3,4},{5,6}};
    l.push_back({1,2});

    for (const auto &arr : l)
        for (const auto &v : arr)
            std::cout << v << ' ';
}
等来平息一些叮当的警告

输出:

3 4 5 6 1 2 
对于C++11,有一个可用的容器,可用于以下标准容器:

#include <array>
#include <iostream>
#include <list>
#include <cstdint>

int
main()
{
    using t_Buffer = ::std::array<::std::int32_t, 2>;
    using t_Buffers = ::std::list<t_Buffer>;
    t_Buffers buffers;
    buffers.emplace_back(t_Buffer{1, 2});
    ::std::cout << buffers.front()[0] << " " << buffers.front()[1] << ::std::endl;
    return(0);
}

#include

标准中的定义没有为第二种类型提供默认类型,因此您必须明确提供这两种类型。如何将数组推送到
列表
3 4 5 6 1 2 
#include <array>
#include <iostream>
#include <list>
#include <cstdint>

int
main()
{
    using t_Buffer = ::std::array<::std::int32_t, 2>;
    using t_Buffers = ::std::list<t_Buffer>;
    t_Buffers buffers;
    buffers.emplace_back(t_Buffer{1, 2});
    ::std::cout << buffers.front()[0] << " " << buffers.front()[1] << ::std::endl;
    return(0);
}