代码之家  ›  专栏  ›  技术社区  ›  rd10 Charlie Carrera

C语言中带负索引的类数组数据结构++

  •  1
  • rd10 Charlie Carrera  · 技术社区  · 6 年前

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

    5 回复  |  直到 6 年前
        1
  •  3
  •   Abhishek Keshri    6 年前

    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;
    }
    
        2
  •  1
  •   schorsch312    6 年前

    您可以创建自己的支持-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);
    
        3
  •  1
  •   moooeeeep    6 年前

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

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

    插入其中的值,删除缺少的值。无需担心负指数。 您可以使用这些方法 std::set::find() std::set::count() 检查项目是否存在。请查看文档以找到一些示例代码。

    如果您后来发现这是一个性能关键型优化,您可以替换 std::set<int> 您可以随时根据位数组编写数据结构。否则,过早地这样做可能会导致不必要的意外错误和浪费时间。

    供参考:

        4
  •  0
  •   DevilaN    6 年前

    最有效的方法是移动数组索引,使它们都是非负的。在你的情况下,只需使用 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)
    

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

        5
  •  0
  •   schorsch312    6 年前

    我认为@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];
        }
    }
    

    可以通过重载 operator [] MyArray的。