vector。begin()返回指针吗
时间: 2023-09-08 10:17:30 浏览: 56
`vector.begin()` 返回的是一个迭代器,它指向 `vector` 中的第一个元素。迭代器虽然类似指针,但并不是指针。可以通过 `*` 运算符来访问迭代器所指向的元素,也可以像指针一样使用 `->` 运算符来访问元素的成员。如果要获取指向第一个元素的指针,可以使用 `vector.data()` 方法。
相关问题
vector模板类中begin()函数和end()函数怎么写
下面是一个示例代码,展示了如何在vector模板类中实现begin()和end()函数:
```c++
template <typename T>
class vector {
public:
// ...
T* begin() {
return data_;
}
const T* begin() const {
return data_;
}
T* end() {
return data_ + size_;
}
const T* end() const {
return data_ + size_;
}
private:
T* data_;
size_t size_;
// ...
};
```
在上面的代码中,我们定义了一个名为`vector`的模板类,并在其中实现了`begin()`和`end()`函数。`begin()`函数返回指向vector中第一个元素的指针,而`end()`函数返回指向vector中最后一个元素的下一个位置的指针。
注意,我们在代码中提供了两个版本的`begin()`和`end()`函数:一个是非常量版本,返回指向非常量元素的指针;另一个是常量版本,返回指向常量元素的指针。这样做的原因是因为,如果我们有一个常量vector对象,我们只能使用常量版本的`begin()`和`end()`函数来访问其中的元素,而不能使用非常量版本。
template <typename T, typename U> static void convert(const std::vector<std::vector<T>>& inputs, std::vector<std::vector<U>>* outputs) { outputs->reserve(inputs.size()); std::transform(inputs.begin(), inputs.end(), outputs->begin(), [](const std::vector<T>& p, std::vector<U>* q) { return convert(p, q); }); }檢查一下
这段代码定义了一个静态函数 `convert`,接受两个模板参数 `T` 和 `U`,以及两个参数 `inputs` 和 `outputs`。其中,`inputs` 是一个二维向量,存储了类型为 `T` 的数据,`outputs` 是一个指向类型为 `std::vector<std::vector<U>>>` 的指针,表示输出的二维向量,存储了类型为 `U` 的数据。
函数的实现过程中,首先使用 `reserve` 函数为输出向量 `outputs` 分配空间,大小为 `inputs.size()`。然后使用 `std::transform` 函数对 `inputs` 中的每个向量进行转换,并将转换结果存储到 `outputs` 中。其中,`std::transform` 函数的第一个参数是输入向量的起始迭代器,第二个参数是输入向量的终止迭代器,第三个参数是输出向量的起始迭代器,第四个参数是一个 lambda 表达式,用于将输入向量中的每个元素转换成输出向量中的元素。这个 lambda 表达式使用了递归调用 `convert` 函数的方式,将输入向量中的每个元素转换成了输出向量中的元素。
需要注意的是,这段代码中的 `outputs->begin()` 调用可能会导致未定义的行为,因为在调用 `outputs->reserve` 函数之后,`outputs` 的大小仍为 0,因此 `outputs->begin()` 会返回一个无效的迭代器。正确的做法是使用 `std::back_inserter` 或 `std::inserter` 等函数来插入新的元素。
阅读全文