【问题标题】:Accessing element of an array of struct.访问结构数组的元素。
【发布时间】:2013-09-16 05:14:31
【问题描述】:

所以我有一个结构

struct car{
   string ownerName;
   float price;
   int year;
};

我声明了一个由这些结构组成的数组 汽车 *汽车 = 新车[1000] 每辆车都有一个索引,例如索引为 0 的汽车的名称为 John Smith。

所以,我的问题是知道车主的姓名如何访问汽车的索引。我知道我会写另一种方式 汽车[0].名称, 得到名字,但我该怎么做呢?

【问题讨论】:

  • 您将使用关联数组类型,拼写为std::map<std::string, size_t>,将字符串映射到数组索引。这将是第二个数据结构,与主要的汽车阵列平行但独立。如果您愿意,可以使用指针而不是 size_t
  • 好的!谢谢你 !我不知道那个数组类型。

标签: c++ arrays struct


【解决方案1】:

我想到了两种可能的方法。 一种是编写一个按名称查找索引的函数。

#include <string>    
using namespace std;

car *find_by_name(car* cars, const string& name, int from, int to) {
    car* car_ptr = NULL;
    for(int i = from; i < to; i++) {
        if (cars[i].ownerName == name) {
            car_ptr = cars+i;
            break;
        }
    }
    return car_ptr;
}

您可能注意到,这个函数非常昂贵(O(n))。 在我看来,另一种也是最简单的一种是使用MapHashMap 来做到这一点。

#include <map>
#include <string>
#include <iostream>
using namespace std;

car set_new_val(map<string, car*>& my_map, const string& name, const float price, const int year) {
    car* car_heap = new car();
    car_heap->ownerName = name;
    car_heap->price = price;
    car_hep->year = year;
    my_map.insert(pair<string, car*>(name, car_heap));
}

car* find_car_by_name(const map<string, car*>& my_map, const string& name) {
    map<string, car*>::iterator it;

    if ((it = my_map.find(name)) == my_map.end())
        return NULL;
    return it->second;
}

int main(int argc, char* argv[]) {
    map<string, car*> my_cars_data;
    set_new_val(my_cars_data, "James", 2233000.5, 2013);
    set_new_val(my_cars_data, "Dave", 1222000.5, 2011);
    set_new_val(my_cars_data, "Aaron", 1222000.75, 2012);

    car* james_car = find_car_by_name(my_cars_data, "James");
    cout << "Year " << james_car->year << endl;
    car* null_car = find_car_by_name(my_cars_data, "Santa");
    if (null_car == NULL)
        cout << "No owner with the name Santa is recorded" << endl;
    ...
    ...

    free_map(my_map);
    return 0;

根据 C++11,使用 Map 查找键需要 O(lgn)(HashMap 是 O(1)),有关详细信息,请阅读 here。如果您处理大量数据(更不用说它更易于维护),那将是一个大专业。

【讨论】:

    【解决方案2】:

    如果您使用顺序容器(数组、向量...),则必须搜索名称。在未排序的数组中,需要进行线性搜索。

    // linear search
    
    string name = "joe";
    auto it = find_if(begin(cars), end(cars), 
        [&name](const car& c) { return c.ownerName == name; });
    
    auto index = it - begin(cars);
    

    如果您在使用这种方法时遇到性能问题,您可以对数组进行排序并使用二分搜索(如果您的汽车数组没有改变,则最好使用)或使用关联容器,以便您快速访问按键元素(map、multi_map、unordered_map...)

    // binary search
    
    struct {
        bool operator()(const car& lh, const car& rh) { return lh.ownerName < rh.ownerName; };
        bool operator()(const car& lh, const std::string& rh) { return lh.ownerName < rh; };
        bool operator()(const std::string& lh, const car& rh) { return lh < rh.ownerName; };
    
    } byName;
    
    sort(begin(cars), end(cars), byName);
    auto it2 = lower_bound(begin(cars), end(cars), name, byName);
    if (it != end(cars) && it->ownerName == name)
    {
        auto index2 = it - begin(cars);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-20
      • 1970-01-01
      • 2013-06-11
      • 2013-10-21
      • 2018-05-27
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      相关资源
      最近更新 更多