[英]How to get an element (struct) in an array by a value in the struct
假設我有一個包含 integer 的結構。
struct Element
{
int number;
Element(int number)
{
this->number = number;
}
};
我將創建一個包含許多 Element 結構的向量。
std::vector<Element> array;
假設數組中的所有 Element 結構都已初始化並設置了它們的數字變量。 我的問題是如何根據變量編號立即獲取元素?
用 for 循環來完成它是很有可能的,但我目前專注於優化並盡量避免盡可能多的 for 循環。
我希望它像通過索引獲取一樣即時:
Element wanted_element = array[wanted_number]
一定有某種重載的東西,但我真的不知道要重載什么運算符或東西。
任何幫助表示贊賞:)
通過實施比較器重載,std::find 可用於幫助:
#include <iostream>
#include <vector>
#include <algorithm>
struct Element
{
int number;
Element(int number)
{
this->number = number;
}
bool operator == (Element el)
{
return number == el.number;
}
};
int main()
{
std::vector<Element> array;
std::vector<int> test;
for(int i=0;i<100;i++)
{
auto t = clock();
test.push_back(t);
array.push_back(Element(t));
}
auto valToFind = test[test.size()/2];
std::cout << "value to find: "<<valToFind<<std::endl;
Element toFind(valToFind);
auto it = std::find(array.begin(),array.end(),toFind);
if(it != array.end())
std::cout<<"found:" << it->number <<std::endl;
return 0;
}
上述方法的性能取決於數組中搜索值的 position。 不存在的值和最后一個元素值將花費最多的時間,而第一個元素將最快找到。
如果您需要優化搜索時間,您可以使用另一種數據結構而不是vector
。 例如, std::map
在這里使用起來很簡單,而且平均速度很快(與 vector-version 的最新元素相比):
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
struct Element
{
int number;
Element(){ number = -1; }
Element(int number)
{
this->number = number;
}
};
int main()
{
std::map<int,Element> mp;
std::vector<int> test;
for(int i=0;i<100;i++)
{
auto t = clock();
test.push_back(t);
mp[t]=Element(t);
}
auto valToFind = test[test.size()/2];
std::cout << "value to find: "<<valToFind<<std::endl;
auto it = mp.find(valToFind);
if(it != mp.end())
std::cout<<"found:" << it->second.number <<std::endl;
return 0;
}
如果您必須使用矢量,您仍然可以使用矢量附近的 map 以與上述方法相同的方式跟蹤其元素,只需在更改矢量時使用額外的 memory 空間和 map 上的額外刪除/更新。
你發明的任何東西最終都會像散列或樹一樣成功。 std::unordered_map 使用哈希,而 std::map 使用紅黑樹。
如果值的范圍非常有限,比如只有 0 到 1000,那么只需將其索引保存在第二個向量中就足夠了:
vec[number] = indexOfVector;
Element found = array[vec[number]];
如果范圍已滿並且您不想使用任何 map 或 unordered_map,您仍然可以在 std::find 方法上使用直接映射緩存。 平均而言,簡單的緩存應該減少重復搜索所花費的總時間(你搜索同一個項目的頻率?)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.