[英]How to fill `std::vector<std::vector<T> >` with default values?
[英]How to initialize std::vector of std:pair of fixed length with default values?
假设一个包含std :: vector且结构类型为std :: pair的结构。
struct block {
std::vector<std::pair<key_t, value_t>> items;
block(const Data& d) : items()
{
items = std::vector<std::pair<key_t, value_t>>(d.size_);
}
};
在代码的后面,我为位置0的向量分配了一个值:
block<key_t, value_t> b(*this);
std::pair<key_t, value_t> item = std::pair<key_t, value_t>(k, v);
b.items[0] = item;
在代码的稍后部分,我想遍历向量,并期望&bucket_item != NULL
仅在位置0处为true,因为我仅在此位置分配了一个值。 实际上, &bucket_item != NULL
始终为true。
for (std::pair<key_t, value_t> item : b.items)
{
if (&item != NULL)
{
...
}
}
我无法使用NULL值来初始化矢量,如下所示:
items = std::vector<std::pair<key_t, value_t>>(d.size_, NULL);
如何解决呢?
似乎您具有Java背景,但C ++有点不同。
items = std::vector<std::pair<key_t, value_t>>(d.size_);
items
已使用其默认构造函数进行了初始化。 上面的行创建了另一个默认的初始化容器,并将其分配给items
,这是不必要的。
在:
b.items[0] = item;
您需要确保向量足够大,因为它不会在operator[]
为您分配元素。 请执行b.items.push_front/back(item)
或使用vector::insert
将其插入特定位置,例如b.items.insert(b.items.begin(), item)
。 push_xxx
和insert
确实为新元素分配内存。
当你做
for (std::pair<key_t, value_t> item : b.items)
{
if (&item != NULL)
遍历容器中所有现有的元素。 item
通过值(不同于Java)存储在容器中,因此它存在于非NULL地址,并且不可能等于NULL
。
但是,表达式for(std::pair<key_t, value_t> item : b.items)
创建堆栈上每个元素的副本(也位于非NULL地址),您可能希望将其作为for(std::pair<key_t, value_t>& item : b.items)
仅引用该元素,而不是复制它(请注意items
左侧的&符号)。 如果您不打算在循环中修改item
,则可能还希望使用const
限定符,以使您的意图对代码阅读者更清楚。 例如for(std::pair<key_t, value_t> const& item : b.items)
。
而且因为无论如何都使用C++11
,所以不必拼写容器元素的类型,只需使用auto
:
for (auto const& item : b.items)
// do something to item
当创建std::vector
具有长度len
这样std::vector<T> tVec(len)
要创建一个vector
与len
类型的默认构造的对象T
。 如果要表示一个空值,则需要采用以下方法之一:
最后一个选项由boost::optional
。 这是使用它的代码重写:
struct block {
using OptionalPair_t = boost::optional<std::pair<key_t, value_t>>;
std::vector<OptionalPair_t> items;
block(const Data& d) : items(d.size_)
{
}
};
由于boost::optional
在上下文中可以转换为bool
,因此您可以执行以下操作:
for (auto& item : b.items)
{
if (item)
{
...
}
}
我认为您在这里混入了一些定义。 std::vector
的元素不能为NULL
,因为它不是指针。 它存在防御。 int arr[] = {1};
, arr[0]
可以为null? 当然不是。 为什么会这样呢? 这是一个真正的整数,可以在内存中的任意位置(不为null)。
如果要遍历std :: vector元素,则意味着它们存在,因此它们不能为null。
可以使用NULL
或更好的nullptr
初始化指针值,但是用它初始化std::string
或std::pair<std::string, int>
毫无意义。
如果希望向量为空,则可以使用:
std::vector<std::pair<key_t, value_t>> items;
另外,如果您想要n
默认构造的std::pair
,则可以使用:
std::vector<std::pair<key_t, value_t>> items(n);
配对确实是价值观的融合。 因此,您必须定义将哪些值组合视为对的NULL等效项。
然后可以使用以下构造函数初始化向量:
std::vector<std::pair<key_t, value_t>> items(d.size_, make_pair(0,0)) ;
您只需用key_t和value_t的中性值替换0。
请注意,向量实际上包含值,而对是值。 因此,没有NULL指针会显示缺少值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.