检索存储在向量

时间:2017-03-06 06:38:00

标签: c++ arrays indexing

我有一个用于存储非重复值的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];

但我想知道还有其他更好/更有效的方法吗?

3 个答案:

答案 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;