gpt4 book ai didi

c++ - vector of vector 的初始化是否可以构建范围?

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:40 31 4
gpt4 key购买 nike

请看下面的代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

// Debug Output
void printVV(std::vector<std::vector<int>>& vv)
{
std::for_each(vv.begin(), vv.end(),
[](std::vector<int>& v) {
std::copy(v.begin(), v.end(),
std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n'; });
std::cout << "\n\n";
}

int main()
{
// Initialized with Initializer List
std::vector<int> v00{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::vector<int> v10{ 10,11,12,13,14,15,16,17,18,19 };
std::vector<int> v20{ 20,21,22,23,24,25,26,27,28,29 };
std::vector<int> v30{ 30,31,32,33,34,35,36,37,38,39 };
std::vector<int> v40{ 40,41,42,43,44,45,46,47,48,49 };

// Fill vector
std::vector<std::vector<int>> v1{ 5,std::vector<int>(v00.begin() + 2,v00.begin() + 5) };
printVV(v1);

// Initializer List
std::vector<std::vector<int>> v2{ v00, v10,v20,v30, v40 };
printVV(v2);

// Range
std::vector<std::vector<int>> v3{ v2.begin() + 1, v2.begin() + 3 };
printVV(v3);

// Subrange init??? ????
//std::vector<std::vector<int>> v4{ }; ????
//printVV(v4);

return 0;
}

因此,我可以用各种方式初始化 vector 的 vector 。全部符合给定的构造函数签名。

现在的问题是:

我们能否也以某种方式使用范围构造函数来初始化子 vector ?

从范围构造函数的签名来看,这似乎是不可能的,因为它需要 2 个迭代器。所以我只能初始化“外部” vector 。如果我还想初始化内部 vector 怎么办。

例如:构建一个 vector of vector of int 并用 v00.begin()+2, v00.begin()+ 4 初始化它,然后用 v10.begin(), v10 初始化下一行。 begin()+ 7 等等。

是否有任何语法是我遗漏的,或者它根本不起作用,如我所料?

最佳答案

Can we also somehow use the range constructor for initialising the sub vectors also?

。正如@rafix07 在评论中指出的那样,可以通过 initlizer-list constructor 来实现。 8 std::vector .

vector( std::initializer_list<T> init, 
const Allocator& alloc = Allocator() );

因为你有整数 vector 的 vector T在上面std::initializer_list<T>将只是 std::vector<int> 类型(即子 vector 或行),可以像您在 v3 中所做的那样进行范围初始化之前。

std::vector<std::vector<int>> v4
{ {v00.begin() + 2,v00.begin() + 4}, {v10.begin(), v10.begin() + 7} };
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -> range init of sub vectors(i.e. std::vector<int>)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -> initializer list (i.e. std::initializer_list<std::vector<int>>)

如果你不想使用 std::initializer_list构造函数,但需要使用 std::vector<std::vector<int>> 的子 vector (每行)的范围构造,另一种方法是使用成员函数 std::vector::insert .它有

的重载
template< class InputIt >
void insert( iterator pos, InputIt first, InputIt last);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^

通过它,您可以将子 vector 范围插入到 v4 .

std::vector<std::vector<int>> v4; 
v4.reserve(2);
v4.insert(v4.end(), v00.begin() + 2, v00.begin() + 4); // range insertion
v4.insert(v4.end(), v10.begin() , v10.begin() + 7); // range insertion

关于c++ - vector of vector 的初始化是否可以构建范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56922377/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com