修改 std::set 中的元素

Modifying elements in std::set

我有以下代码-:

int main()
{
    set<string> s;
    s.insert( "asas" );
    s.insert( "abab" );

    for ( auto item : s )
    {
        cout << item << "\n";
        reverse( item.begin(), item.end() );
    }

    cout << "\n";

    for ( auto item : s )
    {
        cout << item << "\n";
    }
}

输出-:

abab
asas

abab
asas

reverse() 函数根本没有修改集合的元素。
我怀疑集合中的元素根本无法修改。但是,如果是这种情况,为什么编译器本身不首先给出错误?

我在 Windows 7.

上使用带有 -std=c++14 标志的 TDM-GCC 4.9.2

这个基于范围的循环复制集合中的每个元素:

for ( auto item : s )

这就是为什么您可以在循环中修改 item 而不会触发编译器错误的原因。

如果您想修改容器的元素,则需要参考。使用它确实会导致编译器错误,因为无法修改集合的元素:

for ( auto& item : s )
{
  // s is a set. You cannot modify item

std::set 的元素是 const。如果你想改变你需要做插入和移除的元素,将容器置于你想要的状态。

在您的代码示例中:

for (auto item : s)

被翻译成类似的东西:

for (auto iter = s.begin(); iter != s.end(); ++iter)
{
    auto item = *iter; // Copy!
    // loop body
}

循环归纳变量 itemset 中元素的 副本 ,而不是对 [=15] 中实际元素的引用=].结果,set 没有改变。要更改集合,您需要调用 set 的成员函数,例如inserterase.

item 更改为 &item 在这里无济于事;如果你这样做,你会得到一个编译时错误,因为集合的元素是常量,所以你不能对它们应用 reverse

std::set 中的对象是常量,因为它们用作键。所以你不能像这样修改集合中的对象。