修改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。
std::set
的元素是const
。如果你想改变元素,你需要进行插入和删除,以使容器处于你想要的状态。
在您的代码示例中:
for (auto item : s)
被翻译成类似于:
for (auto iter = s.begin(); iter != s.end(); ++iter)
{
auto item = *iter; // Copy!
// loop body
}
循环诱导变量item
是set
中元素的副本,而不是对set
中实际元素的引用。结果,set
没有改变。要更改集合,您需要调用set
的成员函数,例如insert
或erase
。
将item
更改为&item
在这里没有帮助;如果你这样做,你会得到一个编译时错误,因为集合的元素是常量,所以你不能对它们应用reverse
。
这个基于范围的循环复制集合中的每个元素:
for ( auto item : s )
这就是为什么您可以在循环中修改item
而不会触发编译器错误。
如果你想修改容器的元素,你需要一个引用。使用它确实会导致编译器错误,因为集合的元素无法修改:
for ( auto& item : s )
{
// s is a set. You cannot modify item
相关文章:
- 对于set上的循环-获取next元素迭代器
- set::find 查找不存在的元素
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 如何从 std::set 绘制 n 个元素的样本
- 从 std::set 中删除元素,同时在 C++17 中迭代该元素
- 如何在对数时间内访问 c++ std::set 中的第 k 个元素?
- 语言的哪一部分禁止更改 std::set 的元素
- 如何在一对集合的向量中插入元素?vector<pair<int,set<string>>>
- 在 std::set 中查找 std::vector 的元素
- 创建 std::set 只复制一个元素,如何解决这个问题?
- 为什么 std::set 遍历所有元素的速度较慢?
- 为什么在查找元素时需要使用 set.find(x) != set.end()
- 直接访问 STL "set"元素
- 新元素将在std :: set中插入哪里
- std :: set and std :: unordered_set构造元素与emplace()如何
- 通过与不同类型的值进行自定义比较来查找 std::set 的元素
- 删除 std::set<Node *> 中的元素的正确方法
- 如何使用反向迭代器从“std::set”中删除元素
- 给定一个 std::set::iterator,获取一个指向下一个元素的迭代器
- 无法将 std::set 中的元素迭代器插入到 std::list