【发布时间】:2021-08-04 00:16:41
【问题描述】:
我有一个字符串数组,其中每个字符串也可以通过分配给它的唯一指针清楚地识别。该数组中元素的顺序经常发生变化,例如由于排序。
我希望能够仅从其随附的指针中快速找到数组项的数字索引。例如,在下面的代码中对数组进行排序后,我希望0xfeedface 为 0,0xc0decafe 为 1,0xdeadbeef 为 2。当然,我不想遍历所有元素并手动比较指针值,因为这在现实生活中的应用程序中太慢了。那请问我该怎么做呢?
我需要一个仍然允许我使用std::sort 对项目进行排序的解决方案,而且我的目标平台上也没有 C++11,因此该解决方案不需要 C++11 或更高版本。感谢您的帮助!
#include <iostream>
#include <string>
#include <vector>
#include <array>
class RowItem
{
public:
RowItem(std::string text, void *ptr) : m_text(text), m_ptr(ptr) {}
std::string GetText() {return m_text;}
private:
std::string m_text;
void *m_ptr;
};
class RowCmp
{
public:
RowCmp() {}
bool operator()(RowItem &first, RowItem &second) const
{
return first.GetText().compare(second.GetText()) < 0;
}
};
int main()
{
std::vector<RowItem> v;
RowItem one("C\n", (void *) 0xdeadbeef), two("B\n", (void *) 0xc0decafe), three("A\n", (void *) 0xfeedface);
v.push_back(one);
v.push_back(two);
v.push_back(three);
std::sort(v.begin(), v.end(), RowCmp());
for(size_t k = 0; k < v.size(); k++) std::cout << v[k].GetText();
return 0;
}
【问题讨论】:
-
我需要一个仍然允许我使用 std::sort 的解决方案 -- 如果你保持矢量原样,并对指向的索引数组进行排序怎么办?代替物品?然后元素的顺序不会改变(即物理上,
deadbeef仍为 0,但在排序位置将位于index[0])。 -
不管你喜不喜欢,在
m_ptr上没有点餐和/或在上述相同的地图上键入(因此订购是为了搭便车),你所说的," ...在现实生活中的应用程序中会太慢。” 是您唯一的选择。 必须按定义搜索等价的值的无序序列(它们是指针是不相关的)是 O(n) 退化算法。仅当包含容器按所述值排序(例如按 m_ptr 排序)或与原始容器共享内容(索引很好)的地图时,才能将您从冰冷的现实中解救出来。 -
@PaulMcKenzie:我不明白这有什么帮助,因为 AFAIU 我仍然需要遍历所有元素并比较指针值,不是吗?
-
@Andreas 你需要做的就是用向量中的指针和位置构建一个初始映射。无需进行线性搜索,因为您知道,例如,
deadbeef将位于index[map[deadbeef]]的排序位置。问题是您需要额外的空间来存储地图和索引数组。想想数据库是如何做这些事情的。 -
@Andreas
std::map或std::unordered_map。