用迭代器构建一个字符串

时间:2013-11-26 09:15:24

标签: c++ string

给定s类型的字符串std::string我构建另一个字符串s2,如此

std::string(s.begin(), s.begin() + s.find(" "))

但以下构造函数不起作用

std::string(s.begin(), s.find(" "))
谁知道为什么?我正在使用g++ 4.8.1 under Ubuntu amd64

两个构造函数都有一个迭代器作为第二个参数。

在这个例子中,我正在尝试构建一个包含第一个子字符串的字符串,该字符串在第一个空格出现的地方结束。

3 个答案:

答案 0 :(得分:2)

std::string::find()返回一个偏移量,而不是迭代器(是的,它主要是标准库的设计不一致)。所以要使用它(并包括正确的错误检查),请执行以下操作:

size_t offset = s.find(" ");
std::string(s.begin(), (offset == std::string::npos ? s.end() : s.begin() + offset);

答案 1 :(得分:1)

因为find返回索引(size_type)。因为字符串是一个连续的容器,s.begin() + s.find(" ")将返回一个迭代器,因为它等同于调用std::string::iterator operator+=(std::string::size_type s)。第二个当然是编译错误。

答案 2 :(得分:1)

也许你在考虑std::find()算法,它返回一个迭代器?

#include <iostream>
#include <algorithm>

int main()
{
    std::string s = "Derek Smalls";
    std::string s2(std::begin(s), std::find(std::begin(s), std::end(s), ' '));
    std::cout << s2 << std::endl;
}

See it run