[英]Overload vector subscript operator to take a char * or string
我试图重载下标运算符-我知道它是元素访问运算符-以使用char *或std :: string。
我有一个结构
struct foo
{
int Age;
const char *Name;
};
和一个std :: vector将保存此结构的多个实例。
std::vector<foo>bar;
我的目标是能够通过按名称调用每个foo来访问它们。
std::cout<<"Simon's age is: "<<bar["simon"];
我刚刚在Google上搜索了很长一段时间,试图找到一个例子或要解决的问题,但是没有运气。
我认为这会工作
foo operator[](char *Name)
{
for(int i=0;i<bar.size();i++)
{
if(bar[i].Name == Name){return bar[i];}
}
}
但是显然我做错了
我确实知道可以使用std :: map完成此操作,但我宁愿使用std :: vector,谢谢。
非常感谢您的帮助,但是您选择提供它。 谢谢 。
要执行您想要的操作,需要从std :: vector继承。 否则,您将无法重载其方法。
类似于以下内容(未经测试)。
struct fooVector : public std::vector<foo> {
typedef std::vector<foo> super;
using super::size;
...
foo& operator[](char const* Name) {
super& self=*this;
for(int i=0;i<size();i++)
{
if( ! strcmp( self[i].Name, Name) ){return self[i];}
}
// Need to do something reasonable if not found
}
};
bar[i].Name == Name
本来应该是
strcmp(bar[i].Name, Name) == 0
但是,使用std::string
比管理普通char指针更好。
并且,不要继承形式的向量,而是创建一个以向量为成员的类,并在该类上使用operator[]
。
首先,您的测试存在一些问题:
1)您正在使用const char *作为字符串类型,与==进行比较可能会失败,因为您正在比较两个指针而不是它们的内容。 您需要使用strcmp或更好地使用std :: string(C ++方式)
2)如果您的索引运算符找不到所需的值怎么办?
我认为这样做不是正确的方法,但是如果您真的想使用vector,则可以继承自己的类并定义将const char *作为索引参数的新运算符:
#include <vector>
#include <iostream>
#include <string.h>
struct foo {
int age;
const char *name;
};
class MyVector : public std::vector<foo> {
public:
const foo* operator[](const char* name) const {
for (auto it=cbegin(); it != cend(); ++it) {
if (strcmp(it->name, name) == 0) {
return &(*it);
}
}
return nullptr;
}
};
int main(int argc, char *argv[]) {
foo foo1 = { 10, "abc" };
foo foo2 = { 20, "test" };
MyVector v;
v.push_back(foo1);
v.push_back(foo2);
std::cout << "test: " << v["test"]->age << std::endl;
}
尽管通常不建议从stl容器继承它们(它们没有虚拟析构函数),但是如果您不向继承的类添加任何数据属性,则应该没问题。
但我建议您考虑使用std :: map作为容器,并使用std :: string作为索引/名称属性类型。 搜索向量具有线性复杂度,而std :: map具有对数复杂度。 或者,您可以考虑使用哈希表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.