假设一个结构体包含一个带有 std::pair 类型项的 std::vector。
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 处的 vector 赋值:
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;
在代码的后面,我想迭代 vector 并期望 &bucket_item != NULL
仅在位置 0 处为 true,因为我只在该位置分配了一个值。事实上,&bucket_item != NULL
始终为真。
for (std::pair<key_t, value_t> item : b.items)
{
if (&item != NULL)
{
...
}
}
我无法像这样使用 NULL 值初始化 vector :
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;
你需要确保 vector 足够大,因为它不会为你分配 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
关于c++ - 如何使用默认值初始化固定长度的 std::pair 的 std::vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30279850/