Java有一个方便的拆分方法:
String str = "The quick brown fox";
String[] results = str.split(" ");
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法在C++中执行此操作?
如果我将迭代器指向向量的最后一个元素时,它会增加2怎么办?在这个询问如何通过2个元素调整到STL容器的迭代器的问题中,提供了两种不同的方法:
当迭代器指向STL容器的最后一个元素或更远时,我用VC++ 7测试了它们的边缘情况:
vector<int> vec;
vec.push_back( 1 );
vec.push_back( 2 );
vector<int>::iterator it = vec.begin();
advance( it, 2 );
bool isAtEnd = it == vec.end(); // true
it++; // or advance( it, 1 ); - doesn't matter
isAtEnd = it == vec.end(); //false
it = vec.begin();
advance( it, 3 );
isAtEnd = it == vec.end(); // false
Run Code Online (Sandbox Code Playgroud)
我已经看过有时可以建议在遍历vector和其他容器时与vector :: end()进行比较:
for( vector<int>::iterator it = vec.begin(); it != vec.end(); …Run Code Online (Sandbox Code Playgroud) 我的问题是,这段代码是做什么的(来自http://www.joelonsoftware.com/articles/CollegeAdvice.html):
while (*s++ = *t++);
Run Code Online (Sandbox Code Playgroud)
网站说上面的代码复制了一个字符串,但我不明白为什么......
它与指针有关吗?
它是有效的创建一个迭代end(str)+1的std::string?
如果不是,为什么不呢?
这个问题是限制在C++ 11以后,因为在预C++ 11中的数据已经存储在连续块中的任何但是罕见POC玩具的实现,该数据没有具有要被存储的方式.
而且我认为这可能会产生重大影响.
std::string我推测的任何其他标准容器之间的显着差异在于它总是包含一个元素size,而不是它的零终止符,以满足要求.c_str().
21.4.7.1 basic_string访问器[string.accessors]
Run Code Online (Sandbox Code Playgroud)const charT* c_str() const noexcept; const charT* data() const noexcept;1返回:一个指针
p,p + i == &operator[](i)用于每个iin[0,size()].
2复杂性:恒定时间.
3要求:程序不得更改存储在字符数组中的任何值.
尽管如此,尽管它应该保证所述表达式是有效的,但为了保持与零终止字符串的一致性和互操作性,如果没有别的话,我发现的唯一一段对此表示怀疑:
21.4.1 basic_string一般要求[string.require]
4对象中的类似char的
basic_string对象应连续存储.也就是说,任何basic_string对象s,身份&*(s.begin() + n) == &*s.begin() + n应持的所有值n这样0 <= n < s.size().
(所有引用均来自C++ 14最终草案(n3936).)
相关: …
假设你有一个随机访问迭代器(例如std::vector myVector)
什么时候iter + someInt是过去的迭代器,
iter + someInt == myVector.end()??
或者它可能是不同的价值myVector.end()?
我不想使用,std::distance因为它会计算从迭代器到末尾的整个距离。但我需要确保从迭代器到末尾有 N 个或更多元素。所以我正在使用下一个代码:
if (std::next(it, n) != c.end()) // c is a std::multimap
{
/// my logic
}
Run Code Online (Sandbox Code Playgroud)
一切都很好并且可以与我的编译器一起工作(g++ (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)),但我有疑问。在文档(cpprefenece.com && cplusplus.com)中,我找不到有关案例n > std::distance(it , c.end())或任何其他例外情况的任何信息。所以。我的代码安全吗?或者我应该自己写nextIfPossible?