如何在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);
}