我有一个用于存储非重复值的2D数组,并且随机选择了一些条目并将其作为收藏列表推送到向量中。
int num[10][10];
vector<int> fav_list;
int retrieved_i, retrieved_j, retrieve_vector_position;
for(i=0;i<10;i++) for(j=0;j<10;j++)
// ...assign numbers to num...
fav_list.push_back(num[2][3]);
fav_list.push_back(num[4][7]);
fav_list.push_back(num[6][2]);
//...push_back more random selected num[...][...] into fav_list...
问题是,如何检索特定i, j
的{{1}}索引?
我试图制作结构fav_list[...]
以便我可以这样做
struct Num{int value, index_i, index_j;}num[10][10];
但我想知道还有其他更好/更有效的方法吗?
答案 0 :(得分:0)
使用普通矢量存储2D数组可以解决问题。您可以通过计算绝对索引(i * row_len + j)
来访问向量中的元素,并存储在fav_list
绝对索引中。
此外,您可能希望将std::unordered_map
用于fav_list
。通常,哈希表是此类缓存的最有效数据结构。
答案 1 :(得分:0)
根据您希望访问i
&amp;的频率,有几种可能性。 j
指数/最喜欢的数字本身。
一种方法是保存索引而不是数字(或者除了它之外)。使用这种方法,需要更多内存,但访问索引的时间将是恒定的,无论您的阵列有多大。这使用std::pair在您喜欢的矢量中存储2个元素。
#include <vector>
#include <iostream>
#include <utility>
using namespace std;
int main(int argc, char* argv[]) {
int num[10][10];
vector<std::pair<int, int>> fav_list;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (/* your condition for favorites */) {
fav_list.push_back(num[i][j]);
}
}
}
/* example get the indices of the first favorite */
cout << "i: " << fav_list[0].first << "j: " << fav_list[0].second << endl;
/* example get the first favorite */
cout << num[fav_list[0].first][fav_list[0].second] << endl;
return 0;
}
另一种方法是在需要时“查找”索引:它具有条件,即num[][]
数组中包含的一个数字不是多次(否则找到第一个条目)。不需要额外的内存开销,但是当数组变大时,查找索引的时间会增加。
#include <vector>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
int num[10][10];
vector<int> fav_list;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (/* your condition for favorites */) {
fav_list.push_back(num[i][j]);
}
}
}
/* example get the indices of the first favorite */
int indexI = -1, indexJ = -1;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (fav_list[0] == num[i][j]) {
indexI = i;
indexJ = j;
break;
}
}
}
cout << "i: " << indexI << "j: " << indexJ << endl;
/* example get the first favorite */
cout << fav_list[0] << endl;
return 0;
}
答案 2 :(得分:0)
而不是存储3个变量value, x and y
,只需存储一个unsigned int
,您可以通过该x and y
检索struct fav_list
{
unsigned int total_rows;
unsigned int total_columns;
fav_list(unsigned int _rows, unsigned int _columns)
{
total_rows = _rows;
total_columns = _columns;
}
unsigned int get_x(unsigned int _index)
{
return v[_index] / total_columns;
}
unsigned int get_y(unsigned int _index)
{
return v[_index] % total_columns;
}
void append_xy_to_list(unsigned int _x, unsigned int _y)
{
v.push_back(_x * total_columns + _y);
}
vector <unsigned int> v;
};
fav_list f(10, 10);
for(x = 0; x < 10; ++x)
{
for(y = 0; y < 10; ++y)
{
//suppose you want to store the indexes of element num[x][y] then:
f.append_xy_to_list(x, y);
}
}
retrieved_i = f.get_x(retrieve_vector_position);
retrieved_j = f.get_y(retrieve_vector_position);
。
return (
<Article
key={content.id}
...
contentId={content.id}
...
/>
);
});
else
return null;