我创建了一个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
答案 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_value
和operator==
(如果这是一个类而不是基本类型的别名),Id
索引的键,IndexByNonUId
类型,因此可能会被删除或者其他内容), 然后在Container *
索引中查找空字符串应返回与空范围不同的内容。您可能想检查上面的所有条款。