簡體   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