繁体   English   中英

重载向量下标运算符以采用char *或字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM