这里我有简单的代码,它适用于std :: vector,但不适用于std :: list。
是不是因为列表中的元素没有合拢?
修改
好的,将列表放入func的最佳方法是什么?将它转换为矢量?
例如,我将数据放入PolyPolyLine
时需要它#include <iostream>
#include <vector>
#include <list>
using namespace std;
vector<int> func(int* buf)
{
vector<int> t;
t.push_back(buf[0]);
t.push_back(buf[1]);
return t;
}
int main() {
list<int> ls;
vector<int> v;
ls.push_back(2);
ls.push_back(111111);
v.push_back(12);
v.push_back(11);
vector<int> t1= func(&v[0]);
vector<int> t2= func(&ls.front());
cout<<t1[0]<<t1[1];
cout<<t2[0]<<t2[1];
return 0;
}
答案 0 :(得分:7)
std::list<T>
是链表,因此其内存不连续。你不能使用常规指针来做指针算术 - 它是未定义的行为。
如果您改变程序以改为使用迭代器,并使用std::next
来访问当前元素以外的元素,那么您的程序将产生您期望的行为。
template <typename T>
vector<int> func(T buf)
{
vector<int> t;
t.push_back(*next(buf, 0));
t.push_back(*next(buf, 1));
return t;
}
...
vector<int> t1= func(v.begin());
vector<int> t2= func(ls.begin());
答案 1 :(得分:3)
您无法获取列表中项目的地址并将其用作数组。 std :: list是一个带有动态分配节点的双向链表。与向量不同,列表中的元素不是连续的。
答案 2 :(得分:3)
唯一保证连续内存分配的容器是std::vector
(和std::array
)。你没有像std::list
这样的任何保证,这就是为什么这种方法不可行的原因。