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