簡體   English   中英

如何通過結構中的值獲取數組中的元素(結構)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM