从类型为T的数组初始化类型为T*的Stl Vector
Initialise an Stl Vector of type T* from an array of type T
如果我有一个数组,如:
struct S {... };
S m_aArr[256];
,我想用它来构造一个向量,如:
std::vector<S*> m_vecS;
是否有办法这样做,而不是循环并推回&m_aArr[i]
?我明白我不能使用传统的方法使用std::begin
和std::end
上的数组,因为向量是指针之一,原始数组是对象之一,所以我们不能只是传递一块内存。
您可以使用标准库为您执行迭代和推退:
std::transform(std::begin(m_aArr), std::end(m_aArr),
std::back_inserter(m_vecS), std::addressof<S>);
这将通过对std::addressof<S>
函数对m_aArr
中的每个元素进行变换。然后,通过std::back_inserter
迭代器将转换后的每个元素push_back
变换为m_vecS
。
要在c++ 11之前完成此操作,您将无法访问std::begin
, std::end
或std::addressof
,因此它看起来更像这样:
std::transform(m_aArr, m_aArr + 256, std::back_inserter(m_vecS), boost::addressof<S>);
使用boost::addressof
您可以让std::transform
执行循环:
transform(std::begin(a), std::end(a), std::back_inserter(v),
[] (S& s) { return &s; });
注意,您不需要完全限定名称std::transform
,因为函数名称将由ADL找到。
这是一个完整的程序来测试它的行为:
#include <iostream>
#include <vector>
#include <algorithm> // <== Required for std::transform
#include <iterator> // <== Required for std::back_inserter, std::begin, std::end
struct S
{
S() : i(0) { }
S(int i_) : i(i_) { }
int i;
};
int main()
{
S a[256] = { 42 }; // Copy-initializes first element from 42,
// default-constructs all other elements
std::vector<S*> v;
transform(std::begin(a), std::end(a), std::back_inserter(v),
[] (S& s) { return &s; });
std::cout << v.size() << std::endl; // Prints 256
std::cout << v[0]->i << std::endl; // Prints 42
std::cout << v[1]->i << std::endl; // Prints 0
}
这是一个生活例子。
使用std::generate_n()
执行std::vector
的单个分配,而不是通过std::vector::push_back()
进行潜在的多个分配的解决方案:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
struct S {};
S a[128];
S* ap = a;
std::vector<S*> v(sizeof(a)/sizeof(a[0]));
std::generate_n(std::begin(v), v.size(), [&]() { return ap++; });
for (size_t i = 0; i < v.size(); i++)
{
if (&a[i] != v[i]) // Ensure same address at each element.
{
std::cerr << "Errorn";
break;
}
}
return 0;
}
相关文章:
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 检查函数返回类型是否与STL容器类型值相同
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- 具有 STL 向量类型成员的类的复制内存
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- STL 函数和函数类型与函数指针类型
- 如果我想从类型"T"定义元素的容器(来自 STL),那么"T"必须使用默认构造函数?
- 在 stl 容器包装器中定义迭代器类型
- 可以在 stl 容器上完成非类型模板参数吗?
- 模板化函数以从输入参数推断返回类型 stl-container
- 如何处理使用不同类型索引的不同库(例如 stl 和 eigen3)的混合(size_t、int、..)
- 打印/修改类对象的特定成员变量,其类定义列表 (STL) 包含的元素类型
- 如何通过引用对用户定义对象的类型集 (STL) 的数组元素进行增强迭代?
- 如何在 STL 容器中存储具有抽象模板类型的抽象模板化类?
- 在C 中,对Pair类STL的用途是什么,就像数据类型或容器一样
- 指针类型上的 STL 函数对象
- STL 迭代器继承:"value_type"不命名类型
- 在 stl 中迭代结构类型的队列
- STL C 中不同类型的列表声明的错误
- 如何断言模板参数的类型 STL 迭代器类型