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