std::vector<int>* someVector;
// Initialize vector here and add elements
//****
// Now loop vector after initializing it
for (int val : *someVector)
{
doSomething(val);
}
在上面的示例中,迭代这样的矢量是否安全?
答案 0 :(得分:3)
这里的解除引用不是问题,
std::vector<int>* v = new std::vector<int>;
v->push_back(1);
for (int val : *v) {
}
上面的代码完全正常,但是您显示的代码并不表示someVector
是否曾被初始化,或者是否可能已取消初始化。
问题实际上是指针是否有效。如果你知道指针是有效的,那么解引它就可以了,无论是向量,列表,映射还是整数。
std::vector<int>* v = new std::vector<int>;
v->push_back(1);
delete v;
for (int val : *v) {
}
代码将编译并可能运行,但它的作用是完全未定义的行为。
所以“安全”:没有保证。
答案 1 :(得分:2)
在上面的示例中,迭代这样的矢量是否安全?
不,不是。
在进入该循环之前,你显然应该至少检查
curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{
"query": {
"bool": {
"should": [{
"match": {
"roles": {
"query": "supervisor manager",
"operator" : "and"
}
}
},
{
"match": {
"roles": {
"query" : "employee"
}
}
}]
}
} }'
并确保在声明后正确初始化。
甚至可以更好地直接初始化指针。
someVector != nullptr
更好的问题是,为什么在那里使用std::vector<int>* someVector = new std::vector<int>();
指针?