获取指向std :: list的第一个元素的指针

时间:2014-11-20 19:39:42

标签: c++ list vector std

这里我有简单的代码,它适用于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;
}

3 个答案:

答案 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());

Demo.

答案 1 :(得分:3)

您无法获取列表中项目的地址并将其用作数组。 std :: list是一个带有动态分配节点的双向链表。与向量不同,列表中的元素不是连续的。

答案 2 :(得分:3)

唯一保证连续内存分配的容器是std::vector(和std::array)。你没有像std::list这样的任何保证,这就是为什么这种方法不可行的原因。