假设T
是一种类型,我想制作一个vector<vector<T>>
。我知道最终的大小将是m x n
,其中m
和n
是运行时常量。 (如果它们是编译时常量,我将使用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
类似的问题。
答案 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或其变体。