为双向量保留空间

时间:2019-04-27 00:27:30

标签: c++ vector dynamic-memory-allocation

假设T是一种类型,我想制作一个vector<vector<T>>。我知道最终的大小将是m x n,其中mn是运行时常量。 (如果它们是编译时常量,我将使用std::array<std::array<T, n>, m>。)在认真继续执行程序之前,假设我对double向量有三种选择:

选项1

std::vector<std::vector<T>> dbl_vect(m);
for (auto & v : dbl_vect)
    v.reserve(n);

选项2

std::vector<std::vector<T>> dbl_vect;
dbl_vect.reserve(m);

选项3

std::vector<std::vector<T>> dbl_vect;

假设我不担心向量重分配中的迭代器和引用无效,因此我们可以将其从决策过程中删除。

当然,这些代码之后的代码必须有所不同,因为#1创建了dbl_vector的(空)行,因此我们必须访问这些行而不是往后推。

选项#2似乎毫无用处,因为它不知道每行要保留多少空间。

选项#1要求我经过m个空向量的线性遍历并手动调整它们的大小,但是它阻止了重新分配。我认为,如果T很大,那几乎肯定是更可取的,因为它将防止复制/移动。

问题:假设T = char(或选择您喜欢的POD类型)。在什么情况下我应该对选项1和3漠不关心,甚至更喜欢#3?这主要是由于char的相对较小,还是由于编译器将(而不是)默认初始化char的方式?如果T较大(可能是用户定义的),应该在什么时候开始(双矢量的大小或T的大小)?

Here提出了一个与一个向量和T=int类似的问题。

2 个答案:

答案 0 :(得分:0)

如果您知道内部大小为a <- c("BZ", "BZ", "BZ", "US", "US", "US") b <- c(1, 3, 5, 2, 4, 6) c <- data.table(a, b) d <- split(c, c$a) e <- lapply(d, function(x) { names(x)[grepl('b', names(x))] <- unique(x$a) x }) ,则可以制作一个import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main() => runApp(App()); class App extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: "test", theme: ThemeData(primarySwatch: Colors.blueGrey), home: MyWidget(), ); } } class MyWidget extends StatefulWidget { @override _MyWidgetState createState() => _MyWidgetState(); } class _MyWidgetState extends State<MyWidget> { @override Widget build(BuildContext context) { SystemUiOverlayStyle _currentStyle = SystemUiOverlayStyle.dark; return Scaffold( body: AnnotatedRegion( value: _currentStyle, child: Column( children: <Widget>[ Container(height: 80.0, color: Colors.orange), const SizedBox(height: 100.0), RaisedButton( child: Text('Next'), onPressed: () { Navigator.push(context, MaterialPageRoute(builder: (context) => NewScreen())); // .then((value) { // _refreshSystemStatusColor(); // doesn't work // }); }, ) ], ), )); } } class NewScreen extends StatelessWidget { @override Widget build(BuildContext context) { return WillPopScope( onWillPop: () { return Future.value(true); }, child: Scaffold( appBar: AppBar( brightness: Brightness.light, ), body: Container( child: Text('Hello'), )), ); } } ,其中m是代表std::vector<S>的自定义类型,除了它知道它将有多少个条目。建议使用类似的解决方案https://i.imgur.com/foiVXpi.png(除了S是编译时常量)。

答案 1 :(得分:-2)

#3只是默认初始化矢量。您不会从中获得任何收益,因为包含向量的容量为零。动态分配内存的速度很慢,因此,为了使这种情况最小化,我将始终使用#1或其变体。