【发布时间】:2014-09-14 02:00:23
【问题描述】:
我正在尝试在字符串中插入一个字符:
#include <Rcpp.h>
#include<string>
using namespace Rcpp;
f(std::string a){
std::string::iterator i=a.begin()+1;
a.insert(i,',');
std::cout<<a<<"\n";
std::cout<<*i<<"\n";
std::cout<<*(i-1)<<"\n";
}
f("abcd") 将打印:
"a,bcd"
"b"
"a"
我认为 *(i-1) 是 ","。似乎迭代器在这里坏了?所以我不应该将 std::string::iterator 与 std::string 一起使用,就像将 std::vector::iterator 与 std::vector 一起使用?
谢谢!
【问题讨论】:
-
这是未定义的行为。调用
insert后,std::string 的迭代器可能会失效。 -
关于这一点的官方文本:引用 basic_string 序列元素的引用、指针和迭代器可能会因该 basic_string 对象的以下用途而失效: — 作为任何标准的参数将非常量 basic_string 的引用作为参数的库函数。 — 调用非常量成员函数,除了 operator[]、at、front、back、begin、rbegin、end 和 rend。
-
关于最后一句,
std::vector的迭代器也有同样的问题。 -
这令人心碎!@chris
-
你太棒了! @MattMcNabb
标签: c++