假设一个包含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);

如何解决呢?

===============>>#1 票数:3 已采纳

似乎您具有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_xxxinsert确实为新元素分配内存。

当你做

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

===============>>#2 票数:2

当创建std::vector具有长度len这样std::vector<T> tVec(len)要创建一个vectorlen类型的默认构造的对象T 如果要表示一个空值,则需要采用以下方法之一:

  1. 使用前哨值T表示无效值。
  2. 使用(智能)指向 T 指针 ,并使用nullptr作为自然无效值。
  3. T周围包装一个包含将其标记为无效的bool的类。

最后一个选项由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)
    {
       ...
    }
}

===============>>#3 票数:0

我认为您在这里混入了一些定义。 std::vector的元素不能为NULL ,因为它不是指针。 它存在防御。 int arr[] = {1}; arr[0]可以为null? 当然不是。 为什么会这样呢? 这是一个真正的整数,可以在内存中的任意位置(不为null)。

如果要遍历std :: vector元素,则意味着它们存在,因此它们不能为null。

===============>>#4 票数:0

可以使用NULL或更好的nullptr初始化指针值,但是用它初始化std::stringstd::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);

===============>>#5 票数:0

配对确实是价值观的融合。 因此,您必须定义将哪些值组合视为对的NULL等效项。

然后可以使用以下构造函数初始化向量:

std::vector<std::pair<key_t, value_t>> items(d.size_, make_pair(0,0)) ;

您只需用key_t和value_t的中性值替换0。

请注意,向量实际上包含值,而对是值。 因此,没有NULL指针会显示缺少值。

  ask by Scholle translate from so

未解决问题?本站智能推荐:

2回复

使用带有std :: pair的std :: vector emplace_back()和构造函数初始化列表

我试图在我的向量中放入一些值,而不必创建一个临时的std ::对ofVec3f 此代码在Visual Studio 2017中编译。但是执行时上面的代码分配值Geometry [0] .first = {3.0,3.0,3.0}和second = {6.0,6.0,6.0} 我做错
2回复

哪个是初始化std :: map的最佳方法,它的值是std :: vector?

我有以下内容: std::map<std::string, std::vector<std::string>> container; 要添加新项目,请执行以下操作: 有没有更好的方法来增加价值? 谢谢
1回复

如何使用包含std :: thread的std :: vector的结构类型正确初始化std :: vector

这是我的代码的一个迷你示例,该代码演示如何在构造函数中正确初始化成员pool_。 平台:带有g ++ 4.8.4的Ubuntu 14.04 编译命令: 主要错误消息是: 我知道这是因为不允许进行std :: thread的复制构造和分配。 但是我尝试了其他方法,但
1回复

使用lambdas初始化std :: unique_ptr的std :: vector

是否可以使用lambda函数在一行中初始化std::vector ? 我使用以下别名: 到目前为止,我能够做到以下几点: 我想做一些这样的事情,但是在一行中,最好使用lambdas。
5回复

使用重复模式初始化std :: vector

我目前正在使用OpenGL,创建一个“纹理缓存”来处理加载图像并使用OpenGL缓冲它们。 如果无法加载图像文件,则需要回退到我在构造函数中硬编码的默认纹理。 我基本上需要做的是创建一个统一颜色的纹理。 这不是太难,它只是一个像素*颜色通道的数组。 我正在使用std :: vec
2回复

我可以使用std :: vector用其他默认参数初始化元素吗?

我目前正在使用自己的小框架,该框架具有以下设计模式:每个对象都从LObject继承并有一个父对象,当对象中发生某些更改时,它会通知该对象。 这是一个例子: 输出:someInt改变了! 现在,我想实现一个容器类,它应该像这样工作: (暂时我不在乎容器的元素是该容器的子级还
1回复

错误与否? Visual Studio 2013使用std :: string预览std :: vector初始化列表

最后他们做到了。 MSVC12编译器现在允许统一初始化。 但我发现,它与GNU GCC 4.8.1的工作方式不同, -std=C++11标志。 考虑以下代码: GCC的结果(如预期): ( 意思链接 ) MSVC12的结果: 像字符串一样尚未初始化。
2回复

尝试使用初始化列表构造`std :: vector`的问题

考虑以下代码: 对于as1 :我希望std::make_unique<A>({1})调用std::vector的隐式初始化列表构造函数,然后将向量传递给std::make_unique 。 为什么不编译? 对于as2 : std::make_unique的结果是
2回复

如何初始化std :: map项的std :: vector?

我有以下内容: 当我尝试编译时,我收到以下错误: g ++ -std = c ++ 11 -Wall -pedantic ./test.cpp ./test.cpp:6:49:错误:没有用于初始化'std :: vector>'的匹配构造函数(又名'vector,
2回复

为什么std :: vector零会初始化其内存?

我最近注意到std::vector分配后确实清除了零的内存。 我之前已经创建了类似的容器(尽管不符合std标准),并且在创建新项目之前不需要显式将内存清零。 我看不出这样做的理由,我只是想知道为什么。 为了显示 : vector_zeroed()似乎总是返回true而a