为什么 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 次比较。