std :: list <char>列表类型为(char * data,int length)</char>

时间:2009-07-19 13:40:00

标签: c++ stl

我有一些

std::list<char> list_type

现在我必须提供列表的内容为(char * data,int length)。是否有方便的方式将列表内容显示为指针和长度? <vector>有这样的界面吗?

提前谢谢你。

5 个答案:

答案 0 :(得分:4)

您可以使用矢量执行此操作,因为其数据是连续存储的:

std::vector<char> vec;

char* data = &vec[0];
int length = static_cast<int>(vec.size());

对于列表,您必须将数据复制到数组。幸运的是,这也很容易:

std::list<char> list:
int length = static_cast<int>(list.size());
char* data = new char[length]; // create the output array
std::copy(list.begin(), list.end(), data); // copy the contents of the list to the output array

当然,你需要一个动态分配的数组,你必须再次释放。

答案 1 :(得分:1)

你可以用vector而不是list来做到这一点。保证向量是一个重要的内存块,所以你可以说:

char *data = &list_type[0];
std::vector<char>::size_type length = list_type.size();

答案 2 :(得分:1)

我不知道std :: list,但是std :: vector确实:

std::vector<char> list_type;

...

foo(&list_type[0], list_type.size())

std :: string也可以完成这项工作,但你可能已经知道了。

答案 3 :(得分:1)

您无法使用列表执行此操作,因为列表会将其数据保存在列表节点中。但是,您可以使用向量来执行此操作,该向量可确保将其数据存储在连续的内存中。您可以使用&v[0]&*v.begin()来获取指向其第一个元素的指针:

void f(std::list<char>& list)
{
  std::vector<char> vec(list.begin(),list.end());
  assert(!vec.empty());
  c_api_function(&vec[0],vec.size());
  // assuming you need the result of the call to replace the list's content
  list.assign(vec.begin(),vec.end());
}

请注意,当函数返回时,向量将自动释放其内存。 还有(至少)两个值得注意的事情:

  • 矢量不能为空。您不能访问空向量的v[0]。 (你也不允许取消引用v.begin()。)
  • 由于涉及动态分配,因此在std::liststd::vector之间来回转换可能是真正的性能杀手。考虑完全切换到std::vector

答案 4 :(得分:0)

list是链表数据结构。没有转换,你无法在理论上做到这一点。

您将能够在C ++ 0x中访问(C++0x Draft 23.2.6.3vector.data()的后备存储。目前,您最好的选择是通过获取初始元素的地址将其视为数组。