修改 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
}
循环归纳变量 item
是 set
中元素的 副本 ,而不是对 [=15] 中实际元素的引用=].结果,set
没有改变。要更改集合,您需要调用 set
的成员函数,例如insert
或 erase
.
将 item
更改为 &item
在这里无济于事;如果你这样做,你会得到一个编译时错误,因为集合的元素是常量,所以你不能对它们应用 reverse
。
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
}
循环归纳变量 item
是 set
中元素的 副本 ,而不是对 [=15] 中实际元素的引用=].结果,set
没有改变。要更改集合,您需要调用 set
的成员函数,例如insert
或 erase
.
将 item
更改为 &item
在这里无济于事;如果你这样做,你会得到一个编译时错误,因为集合的元素是常量,所以你不能对它们应用 reverse
。
std::set 中的对象是常量,因为它们用作键。所以你不能像这样修改集合中的对象。