std:vector<T>任意大小和任意起点

std:vector<T> of arbitrary size and arbitrary starting point

提问人:Ivan 提问时间:9/24/2022 更新时间:9/24/2022 访问量:175

问:

假设我想要一个 ,并说我有 1000 个元素。into 有一个任意的起点,比如 15000 到 16000(1000 个元素)。std:vector<T>TindexT

没有 16000 个元素,我如何创建 15000 是索引,1,15001 是索引 2,等等。allocatingvector<T>

我知道我可以用 来做到这一点,但我的索引自然是 15000 到 16000 范围内的整数。Hash

我可能还可以从 Vector 和 继承我自己的类,以便将 15000 转换为 1 等,但我只是想知道是否有这个商品版本。overloadoperator []

C++ Boost 标准

评论

3赞 Brady Dean 9/24/2022
从索引中减去 15000?
1赞 François Andrieux 9/24/2022
std::vector始终从索引 0 开始。您可以轻松地将 a 包装在自己的类中,该类可以对传递给它的任何索引应用偏移量。std::vector
0赞 Ivan 9/24/2022
对,通过重载运算符[]。我想这就是答案,而且并没有那么慢

答:

3赞 kouta-kun 9/24/2022 #1

AFAIK,的指数不是变量,它总是从 0 开始。您可以手动从索引中减去 15000,如下所示:std::vector

for(int i = 15000; i < 16000; i++) {
    std::cout < vector[i - 15000] << std::endl;
}

或者创建一个为您执行此操作的类:

#include <vector>
#include <iostream>

template<typename T>
class VectorWrap : public std::vector<T> {
  typedef std::vector<T> super;
  size_t index_base;
public:
  VectorWrap(size_t index) : index_base{index} {}

  typename super::reference at(size_t pos) {
    return super::at(pos - index_base);
  }
  typename super::reference operator[](size_t pos) {
    return super::operator[](pos - index_base);
  }
};

int main(int argc, char** argv) {
  VectorWrap<int> vw{15000};
  vw.push_back(5);
  vw.push_back(6);
  vw.push_back(7);

  std::cout << vw[15000] << std::endl;
  vw[15000] = 1;
  std::cout << vw[15000] << std::endl;
}