使用C ++和STL,是否有人知道如何将整数数组存储为STL列表或向量中的节点?我需要存储未知数量的数字对,并且来自其他语言,我首先想到的是使用某种类似列表或矢量的数据结构......但是我遇到了一些麻烦。我百分百肯定我犯了一个明显的初学者的C ++错误,并且真正了解这种语言的人会看一眼我正在尝试做的事情,并能够让我直截了当。
所以,这就是我尝试过的。声明这样的列表有效:
stl::list<int[2]> my_list;
然后我可以很容易地创建一个双元素数组,如下所示:
int foo[2] = {1,2};
这编译并运行得很好。但是,只要我尝试将foo
添加到我的列表中,就像这样:
my_list.push_back(foo);
我得到了一整套粗略的编译器错误,其中没有一个我真正理解(我的C ++ - fu几乎不存在):
/usr/include/c++/4.0.0/ext/new_allocator.h: In member function ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = int [2]]’:
/usr/include/c++/4.0.0/bits/stl_list.h:440: instantiated from ‘std::_List_node<_Tp>* std::list<_Tp, _Alloc>::_M_create_node(const _Tp&) [with _Tp = int [2], _Alloc = std::allocator<int [2]>]’
/usr/include/c++/4.0.0/bits/stl_list.h:1151: instantiated from ‘void std::list<_Tp, _Alloc>::_M_insert(std::_List_iterator<_Tp>, const _Tp&) [with _Tp = int [2], _Alloc = std::allocator<int [2]>]’
/usr/include/c++/4.0.0/bits/stl_list.h:773: instantiated from ‘void std::list<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = int [2], _Alloc = std::allocator<int [2]>]’
test.cpp:5: instantiated from here
/usr/include/c++/4.0.0/ext/new_allocator.h:104: error: ISO C++ forbids initialization in array new
所以,任何人都有关于我在这里做错了什么的想法?任何指针(没有双关语)都是最有帮助的。是不是可以将数组存储在std :: list中?我应该使用结构吗?我在某个地方错过了*
或&
吗?
答案 0 :(得分:24)
存储在标准库容器中的东西必须是可分配和可复制的 - 数组都不是。最好的办法是创建一个std :: vector列表。或者,您可以将数组包装在结构中:
struct A {
int array[2];
};
std::list <A> alist;
答案 1 :(得分:9)
您无法在STL容器中存储数组。你会使用矢量矢量或一般情况下的一些。对于你的具体情况,我会使用std :: pair的向量,如下所示:std::vector<std::pair<int, int> >
。 std::pair
是一个包含两个成员first
和second
的类,无论您将其模板化为何种类型。
编辑:我最初将它作为std::vector<std::pair<int> >
,但我不确定是否重载只接受1个参数,两种类型都相同......有点挖掘没有证据这个,所以我修改它以明确说明first
和second
都是int
s。
答案 2 :(得分:7)
这是使用boost::array而不是“经典”C风格数组的好情况。 这应该有效:
std::list<boost::array<int,2> > my_list;
boost::array<int,2> foo={{1,2}};
my_list.push_back(foo);
答案 3 :(得分:5)
我建议你使用std :: pair来存储这种情况下的值。它位于
<utility>
。
您可以在列表中存储指向数组的指针,但是您必须处理所有内存管理。如果你需要成对的值,使用pair会简单得多。
答案 4 :(得分:1)
从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 << ' ';
}
或
l.push_back({{1,2}});
等。沉默一些警告。
输出:
3 4 5 6 1 2
答案 5 :(得分:1)
使用C ++ 11,有一个::std::array
wrapper可用于标准容器,如下所示:
#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);
}