使用for循环的c ++中的向量

时间:2018-05-22 04:17:17

标签: c++ vector struct

我一般都是c ++的新手。因此,在最近帮助使用Arduino类型项目读取RFID标签后,我一直在努力学习使用矢量。它真的让我觉得我不知道如何编程。所以我打了书!

所以这是一个问题:当我执行以下代码时:

#include <iostream>
#include <vector>

struct Runner{
    char runnerTag[32];
    uint32_t ts;
};

std::vector<Runner > runners;

int main() {
    std::cout << "Hello, Runners!\n";
    for (int i = 0; i < 100; i++) {
        std::string runnertg = "testTrackTag01";
        uint32_t timeStamp = rand() % 100 + 1;
        runners[i] = new Runner({runnertg, timeStamp});
    }
    return 0;
}

我从xcode收到了这个恼人的小消息:

No matching constructor for initialization of 'Runner'

在上面代码段的第16行。世界上我做错了什么?

3 个答案:

答案 0 :(得分:3)

  1. 表达式new Runner({runnertg, timeStamp})的类型不匹配。 runnertg的类型为std::string,而元素Runner::runnerTag的类型为char[32]

  2. 表达式runners[i] = new Runner({runnertg, timeStamp});有另一种类型不匹配。 runners的元素类型为Runner,而new Runner({runnertg, timeStamp})表达式的类型为Runner*

  3. runners[i]是超出范围的访问权限。 runners的大小为0. runners[i]的所有值的元素i都不存在。

  4. 由于所有代码路径的每个delete都没有匹配new,因此存在内存泄漏。

  5. 请勿使用rand()

答案 1 :(得分:3)

你正在使用的许多代码都是旧样式C,其中包含一些C ++ STL代码。我将尝试解决一些问题。

struct是一种抽象数据类型(通常用于组织原始数据类型)。虽然structclass之间的唯一区别是后者默认所有成员都是私有的,在这种情况下不起作用,但在通过时削减这些内容是件好事。

其次,char的数组很麻烦,很乱,容易出错。请改为std::string

最后,让我们创建一个带有两个参数的构造函数。

因此:

#include <string>

class Runner {
public:
    std::string runnerTag;
    uint32_t ts;

    Runner(std::string, uint32_t);
};

接下来的事情。使用数组索引操作符[]来访问或修改std::vector是危险的,并且无法使用容器及其随附的所有精彩功能。

既然你知道for循环,那就试试吧:

for (int i = 0; i < 100; i++) {
    std::string runnertg = "testTrackTag01";
    uint32_t timeStamp = rand() % 100 + 1;
    Runner Runner(runnertg, timeStamp);
    runners.push_back(Runner);
}

在代码的最后,在main函数的范围之外,按如下方式定义构造函数:

Runner::Runner(std::string rt,  uint32_t ts) {
    runnerTag = rt;
    ts = ts;
}

这应该让你开始。

答案 2 :(得分:0)

您无法将std::string转换为char数组。将成员变量runnerTag的类型更改为std::string。此外,您正在访问不存在的矢量元素。使用resize创建它们。或者更好的是,使用emplace_back同时执行这两项操作。另外,请勿使用int来迭代容器,但std::size_t。另外,请不要使用rand(),而应使用<random>标题中的类。使用%的技巧会产生不均匀的分布。