插入后无法找到提升multi_index

时间:2016-10-20 02:10:45

标签: c++ boost multi-index boost-multi-index

我创建了一个boost multi_index,我在其中插入对象。

我的multi_index看起来如下,

typedef boost::multi_index_container<
    Container*,
    boost::multi_index::indexed_by<
        boost::multi_index::hashed_unique<
            boost::multi_index::tag<IndexByUniqueId>,
            boost::multi_index::const_mem_fun<StoreMe, Id, &StoreMe::getUId> 
        >,
        boost::multi_index::hashed_non_unique<
            boost::multi_index::tag<IndexByNonUId>,
            boost::multi_index::const_mem_fun<StoreMe, std::string, &Container::getNUIdString> 
        >
    >
> mi_Container;

当我插入对象时,对象中最初不存在非唯一ID和唯一ID。在程序的后期,他们会得到更新,并且只有在那之后才会更新&#34; getNUIdString&#34;和&#34; getUId&#34;将返回0 /非空值。

在这种情况下,当我尝试使用非唯一ID查找时,我无法获取存储的值。是否预计它们在插入时会被填满?或者,如果它们在需要时更新并且当时我仍然可以查看我的价值,那么它是否正常?

EDIT1:

我知道我需要使用&#34;替换&#34;来更新索引。或者&#34;修改&#34;而索引改变了。因此,最初插入带有空字符串的插入作为一个索引的键,而另一个索引插入0时,当我查找使用特定值时,它不会返回任何内容吗?这意味着如果我查找使用空字符串&#34;&#34;。它应该返回所有值(因此将是查找时间O(n))?

EDIT2: 我尝试将所有值映射到&#34;&#34;,空字符串。我仍然没有结果。这对迭代器中的第一个等于end()。

另外,如果我想在该对象的setter中设置值时,只更改只有一个的non_unique键值对的键的值,我该怎么做?每次我通过对象的setter设置一个值时,我都想这样做,这样我就可以使用我拥有的multi_index来查找它了。

TIA

-R

1 个答案:

答案 0 :(得分:1)

通过您提供的小上下文,您只能猜测。只要

  • 您已为@Override protected void onPreExecute() { super.onPreExecute(); printAdapter = webView.createPrintDocumentAdapter(); } @Override protected Void doInBackground(Void... voids) { File file = new File(pdfPath); if (file.exists()) { file.delete(); } try { file.createNewFile(); // get file descriptor descriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_WRITE); // create print attributes PrintAttributes attributes = new PrintAttributes.Builder() .setMediaSize(PrintAttributes.MediaSize.ISO_A4) .setResolution(new PrintAttributes.Resolution("id", PRINT_SERVICE, 300, 300)) .setColorMode(PrintAttributes.COLOR_MODE_COLOR) .setMinMargins(new PrintAttributes.Margins(0, 0, 0, 0)) .build(); ranges = new PageRange[]{new PageRange(1, numberPages)}; // dexmaker cache folder cacheFolder = new File(context.getFilesDir() +"/etemp/"); printAdapter.onStart(); printAdapter.onLayout(attributes, attributes, new CancellationSignal(), getLayoutResultCallback(new InvocationHandler() { @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { if (method.getName().equals("onLayoutFinished")) { onLayoutSuccess(); } else { Log.e(TAG, "Layout failed"); pdfCallback.onPdfFailed(); } return null; } }, cacheFolder), new Bundle()); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, e != null ? e.getMessage() : "PrintPdfTask unknown error"); } return null; } private void onLayoutSuccess() throws IOException { PrintDocumentAdapter.WriteResultCallback callback = getWriteResultCallback(new InvocationHandler() { @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable { if (method.getName().equals("onWriteFinished")) { pdfCallback.onPdfCreated(); } else { Log.e(TAG, "Layout failed"); pdfCallback.onPdfFailed(); } return null; } }, cacheFolder); printAdapter.onWrite(ranges, descriptor, new CancellationSignal(), callback); } /** * Implementation of non public abstract class LayoutResultCallback obtained via DexMaker * @param invocationHandler * @param dexCacheDir * @return LayoutResultCallback * @throws IOException */ public static PrintDocumentAdapter.LayoutResultCallback getLayoutResultCallback(InvocationHandler invocationHandler, File dexCacheDir) throws IOException { return ProxyBuilder.forClass(PrintDocumentAdapter.LayoutResultCallback.class) .dexCache(dexCacheDir) .handler(invocationHandler) .build(); } /** * Implementation of non public abstract class WriteResultCallback obtained via DexMaker * @param invocationHandler * @param dexCacheDir * @return LayoutResultCallback * @throws IOException */ public static PrintDocumentAdapter.WriteResultCallback getWriteResultCallback(InvocationHandler invocationHandler, File dexCacheDir) throws IOException { return ProxyBuilder.forClass(PrintDocumentAdapter.WriteResultCallback.class) .dexCache(dexCacheDir) .handler(invocationHandler) .build(); } 课程正确实施了boost::hash_valueoperator==(如果这是一个类而不是基本类型的别名),
  • 您插入的所有元素都有一个空字符串作为Id索引的键,
  • 你真的设法插入一些东西(即容器不是空的),
  • 元素仍然有效(我发现它们属于IndexByNonUId类型,因此可能会被删除或者其他内容),
  • 你没有改变元素的键,

然后Container *索引中查找空字符串应返回与空范围不同的内容。您可能想检查上面的所有条款。