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

Vector in c++ using for loop

本文关键字:向量 c++ 使用 循环 for      更新时间:2023-10-16

我一般是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 行。我到底做错了什么?

  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。i的所有值runners[i]的元素不存在。

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

  5. 不要使用rand().

你使用的很多代码都是旧式的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;
}

这应该让你开始。

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