为什么 Boost multi_index 在只修改第一个索引的键时对第二个索引执行比较?
Why does Boost multi_index perform a comparison on the second index when only modifying the key of the first?
以下代码使用 Boost 1.72.0:
#include <iostream>
#include <string>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>
struct Foo
{
int intProp_;
std::string stringProp_;
};
template<typename T>
struct LoggingLess
{
auto operator()(const T& first, const T& second) const
{
std::cout << "Comparing '" << first << "' to '" << second << "'\n";
return std::less<T>()(first, second);
}
};
int main()
{
using namespace boost::multi_index;
typedef multi_index_container<Foo, indexed_by<
ordered_non_unique<member<Foo, int, &Foo::intProp_>>,
ordered_non_unique<member<Foo, std::string, &Foo::stringProp_>, LoggingLess<std::string>>
>> FooContainer;
FooContainer container;
container.insert({ 1, "xyz" });
container.insert({ 2, "abc" });
std::cout << "Insert finished\n";
auto& intIndex = container.get<0>();
intIndex.modify_key(intIndex.begin(), [](int& value)
{
value += 100;
});
}
具有以下输出:
Comparing 'abc' to 'xyz'
Insert finished
Comparing 'xyz' to 'abc'
鉴于我只更新第一个索引中使用的整数值,为什么 boost multi_index 也比较字符串?这可能会对字符串等键产生重要的性能影响。
这是一个简单的疏忽还是实施的一些限制?
在您使用的任何 API 中都没有书面保证编辑键不能更改其他索引的顺序。
所以boost不假设。
它保证如果你的操作不改变相对于其他键的顺序,它的容器大小将是 O(1)。但它会验证这一点,这就是您所看到的;每个有序键最多需要 2 次比较。
以下代码使用 Boost 1.72.0:
#include <iostream>
#include <string>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>
struct Foo
{
int intProp_;
std::string stringProp_;
};
template<typename T>
struct LoggingLess
{
auto operator()(const T& first, const T& second) const
{
std::cout << "Comparing '" << first << "' to '" << second << "'\n";
return std::less<T>()(first, second);
}
};
int main()
{
using namespace boost::multi_index;
typedef multi_index_container<Foo, indexed_by<
ordered_non_unique<member<Foo, int, &Foo::intProp_>>,
ordered_non_unique<member<Foo, std::string, &Foo::stringProp_>, LoggingLess<std::string>>
>> FooContainer;
FooContainer container;
container.insert({ 1, "xyz" });
container.insert({ 2, "abc" });
std::cout << "Insert finished\n";
auto& intIndex = container.get<0>();
intIndex.modify_key(intIndex.begin(), [](int& value)
{
value += 100;
});
}
具有以下输出:
Comparing 'abc' to 'xyz'
Insert finished
Comparing 'xyz' to 'abc'
鉴于我只更新第一个索引中使用的整数值,为什么 boost multi_index 也比较字符串?这可能会对字符串等键产生重要的性能影响。
这是一个简单的疏忽还是实施的一些限制?
在您使用的任何 API 中都没有书面保证编辑键不能更改其他索引的顺序。
所以boost不假设。
它保证如果你的操作不改变相对于其他键的顺序,它的容器大小将是 O(1)。但它会验证这一点,这就是您所看到的;每个有序键最多需要 2 次比较。