数组结构,如C ++中的negetive索引

时间:2018-04-12 10:02:04

标签: c++ arrays data-structures

我需要一个结构来跟踪某些项目的存在。我只是想取一个数组a0 .... aN并将元素标记为[0] = 0,a [1] = 0,a [2] = 1 ........({{1如果元素存在,a[i]=1如果元素不存在)。 但项目范围从-1000到+1000。它可以通过将负范围从1001到2000来完成。我需要知道c ++中是否有任何其他数据结构可以像数组一样工作并且具有负索引。谢谢你的时间。

5 个答案:

答案 0 :(得分:3)

map仅用于此目的,具有任何基本/用户定义数据类型的key/index。见 - http://www.cplusplus.com/reference/map/map/

您的案例示例:

#include <iostream>
#include <map>
#include <string>

int main ()
{
  std::map<int, int> mymap;

  mymap[-1]=1;
  mymap[-2]=0;
  mymap[-3]=1;

  std::cout << mymap[-1] << '\n';
  std::cout << mymap[-2] << '\n';
  std::cout << mymap[-3] << '\n';

  return 0;
}

char:

的示例
#include <iostream>
#include <map>
#include <string>

int main ()
{
  std::map<char,std::string> mymap;

  mymap['a']="an element";
  mymap['b']="another element";
  mymap['c']=mymap['b'];

  std::cout << "mymap['a'] is " << mymap['a'] << '\n';
  std::cout << "mymap['b'] is " << mymap['b'] << '\n';
  std::cout << "mymap['c'] is " << mymap['c'] << '\n';
  std::cout << "mymap['d'] is " << mymap['d'] << '\n';

  std::cout << "mymap now contains " << mymap.size() << " elements.\n";

  return 0;
}

答案 1 :(得分:1)

您创建自己的数据结构,支持-ve索引。只需在索引中添加偏移量,同时将它们存储在数组中。

class MyArray {
    int *arr;
    public:
    MyArray(int offset) {
        arr = new int[2*offset]; // size must to double the offset
    }
    ~MyArray(){
        delete arr;
    }
    void add(int index, int val) {
        arr[index + offset] = val;
    }
    void get(int index) {
        return arr[index + offset];
    }
}

然后你可以使用你的类来添加和获取任何索引的元素。

MyArray arr = MyArray(1000); // pass max -ve index as offset
arr.add(10, -150);
cout << arr.get(100);

答案 2 :(得分:1)

  

我需要一个结构来跟踪某些项目的存在。

如果您想要设置语义,请使用设置数据结构。 无需实现自定义数组包装器。 您可以使用std::set(或std::unordered_set)。请记住"premature optimization is the root of all evil"

插入那里的值,省略缺失的值。无需担心负面指数。 您可以使用方法std::set::find()std::set::count()来检查项目的存在。查看文档以查找一些示例代码。

如果您以后发现它是性能关键优化,您可以随时使用您自己编写的数据结构替换std::set<int>。如果不是这样,过早地这样做可能会成为不必要的意外错误来源和浪费时间。

供参考:

答案 3 :(得分:0)

最有效的方法只是改变你的数组索引,所以它们都是非负的。在您的情况下,只需使用a[i+1000]即可。

如果你真的需要使用负面索引,那么也是可能的。 C / C ++使用表的地址计算数组元素的内存地址,然后为其添加索引值。使用负数只是指向放在桌子前面的内存区域(这通常不是你想要的)。

int a[2001];
int *b = &a[1000];
int x = b[-1000]; // This points to 1000 places before b which translates to a[0] (valid place)

另一种方法是使用容器。然后任何数字都可以转换为字符串并存储在适当的容器中。

答案 4 :(得分:0)

我认为@Rajev的答案几乎没问题。我刚刚用std::vector替换了一个普通数组。因此,内存管理是安全的,复制和移动很容易。

template <typname T>
class MyArray {
  private:
    std::vector<T> arr;
  public:
    MyArray(int offset) {
        arr.resize(2*offset); // size must to double the offset
    }

    void set(int index, int val) {
        arr[index + offset] = val;
    }

    void get(int index) {
        return arr[index + offset];
    }
}

您可以通过重载MyArray的operator []来进一步扩展它。