在 QMap 的特定偏移量处获取项目

Get item at specific offset of QMap

我有一个代表数据库行的 QMap。这些项目按列名索引:

QMap<QString, QVariant> mapOfItems_;

然后我有一种方法可以按列名称检索项目:

QVariant ImportDataSourceRow::byName( const QString& name )
{
    if(mapOfItems_.contains(name))
      return mapOfItems_.value(name);
    else
      throw NoSuchColumn();
}

我还想实现按列索引获取项目的方法(第一列 0):

QVariant ImportDataSourceRow::byIndex( size_t index )
{
    // Now what?
}

如何从地图中获取偏移 index 处的值? QMap 甚至可以保证按我的需要订购吗?

QMap 的条目保证按键排序,在您的情况下是 QString::operator<.

要获取地图内的位置,您可以使用:

const auto it = mapOfItems.find(name);
const auto index = std::distance(mapOfItems.begin(), it);

请注意,如果您使用 constFind() 并在返回的迭代器等于 mapOfItems.constEnd() 时抛出异常,而不是执行两次查找(包含和 value()),那么您的 byName() 方法会更有效。

关联(类字典)容器,如 QMapstd::map 很少提供顺序索引,因为它们在内部 通常 作为树状数据实现结构(例如,Red-Black Tree)。

值得注意的例外是 boost 的 flat_map。它被实现为一对连续的数组,其中键和值的映射用数组索引表示:映射的键和值具有相同的索引。 flat_map 提供方法 nth() 通过索引访问值:

boost::container::flat_map<std::string, float> geek_numbers;
geek_numbers.emplace("pi", 3.14f);
geek_numbers.emplace("e", 2.72f);
geek_numbers.emplace(
    "Answer to the Ultimate Question of Life, The Universe, and "
    "Everything",
    42.0f);
auto 0th = geek_numbers.nth(0); // 42.0f
auto 1st = geek_numbers.nth(1); // 2.72f
auto 2nd = geek_numbers.nth(2); // 3.14f

flat_map "emulates" std::map 的界面和行为,并按键对元素进行排序。您可以使用自定义谓词。

请注意,标准容器仅适用于最简单的类似数据库的用例。一般来说,数据库是一个非常复杂的话题。有整个theories being built about it. If your dataset is large and you need to perform complicated indexing and queries, think about embedding one of the database engines available (e.g. SQLite, or other, more heavyweight ones).

不推荐,但你可以尝试这样做:

QList<QString> list = mapOfItems_.values();
if(index>=0 && index<list.count()) return list.at(index);
return QString();

虽然不知道它如何与 QVariant 一起使用。