将 int 数组转换为 std::vector<int*>
Convert int array to std::vector<int*>
我正在尝试 "convert" 一个整数 C 样式数组到 std::vector<int*>
而不使用 for
循环,或者更确切地说,将所有数组项的指针插入向量中。
我目前正在通过执行以下操作来实现此目的:
for (size_t i = 0; i < 5; i++)
{
vector.push_back(&values[i]);
}
是否可以使用 std::vector::insert()
和 std::being/end
来实现?
std::transform
is a useful algorithm in <algorithm>
用于在不隐式兼容但可以为其提供转换函数的容器之间复制值。
这是一个示例,说明如何从 std::array<int, N>
填充 std::vector<int*>
int values[5] = { 1,2,3,4,5 };
std::vector<int*> v1;
std::transform(
std::begin(values), std::end(values), // Copy from
std::back_inserter(v1), // Copy to
[](auto& i) { // Transformation function
return &i;
});
编辑:将 std::array<int, 5>
更改为 int[5]
以说明问题中的编辑。
注意:正如评论中指出的那样,我的以下答案错误地与 vector<int>
相关,而不是 vector<int*>
相关问题。
使用 std::copy
和 C 样式数组的解决方案:
int ar[] = {1,2,3,4,3,2,1};
std::vector<int> vec;
std::copy(ar, ar+sizeof(ar)/sizeof(ar[0]), back_inserter(vec));
下面的代码是一种相当奇特的方式来做你想做的事,但它是通用的,它不使用 for 循环 - 它只是将数组元素的指针传递给 vector构造函数:
template<class T, size_t ... Ints, size_t N>
std::vector<T*> makePtrsHelper(std::array<T,N>& arr, std::index_sequence<Ints...>) {
return std::vector<T*>{ & std::get<Ints>(arr)... };
// vector ctor taking pointers to array's elements
}
template<class T, size_t N>
std::vector<T*> makePtrs(std::array<T,N>& array) {
return makePtrsHelper(array, std::make_index_sequence<N>{});
}
int main(){
std::array<int,5> ar{1,2,3,4,5};
std::vector<int*> v = makePtrs(ar);
我正在尝试 "convert" 一个整数 C 样式数组到 std::vector<int*>
而不使用 for
循环,或者更确切地说,将所有数组项的指针插入向量中。
我目前正在通过执行以下操作来实现此目的:
for (size_t i = 0; i < 5; i++)
{
vector.push_back(&values[i]);
}
是否可以使用 std::vector::insert()
和 std::being/end
来实现?
std::transform
is a useful algorithm in <algorithm>
用于在不隐式兼容但可以为其提供转换函数的容器之间复制值。
这是一个示例,说明如何从 std::array<int, N>
std::vector<int*>
int values[5] = { 1,2,3,4,5 };
std::vector<int*> v1;
std::transform(
std::begin(values), std::end(values), // Copy from
std::back_inserter(v1), // Copy to
[](auto& i) { // Transformation function
return &i;
});
编辑:将 std::array<int, 5>
更改为 int[5]
以说明问题中的编辑。
注意:正如评论中指出的那样,我的以下答案错误地与 vector<int>
相关,而不是 vector<int*>
相关问题。
使用 std::copy
和 C 样式数组的解决方案:
int ar[] = {1,2,3,4,3,2,1};
std::vector<int> vec;
std::copy(ar, ar+sizeof(ar)/sizeof(ar[0]), back_inserter(vec));
下面的代码是一种相当奇特的方式来做你想做的事,但它是通用的,它不使用 for 循环 - 它只是将数组元素的指针传递给 vector构造函数:
template<class T, size_t ... Ints, size_t N>
std::vector<T*> makePtrsHelper(std::array<T,N>& arr, std::index_sequence<Ints...>) {
return std::vector<T*>{ & std::get<Ints>(arr)... };
// vector ctor taking pointers to array's elements
}
template<class T, size_t N>
std::vector<T*> makePtrs(std::array<T,N>& array) {
return makePtrsHelper(array, std::make_index_sequence<N>{});
}
int main(){
std::array<int,5> ar{1,2,3,4,5};
std::vector<int*> v = makePtrs(ar);