我有一些
std::list<char> list_type
现在我必须提供列表的内容为(char * data,int length)。是否有方便的方式将列表内容显示为指针和长度? <vector>
有这样的界面吗?
提前谢谢你。
答案 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::list
和std::vector
之间来回转换可能是真正的性能杀手。考虑完全切换到std::vector
。 答案 4 :(得分:0)
list
是链表数据结构。没有转换,你无法在理论上做到这一点。
您将能够在C ++ 0x中访问(C++0x Draft 23.2.6.3)vector
和.data()
的后备存储。目前,您最好的选择是通过获取初始元素的地址将其视为数组。