首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用迭代器构建字符串

使用迭代器构建字符串
EN

Stack Overflow用户
提问于 2013-11-26 09:15:23
回答 3查看 79关注 0票数 2

给定一个类型为std::string的字符串std::string,我构建了另一个字符串s2,如下所示

代码语言:javascript
复制
std::string(s.begin(), s.begin() + s.find(" "))

但是下面的构造函数不起作用

代码语言:javascript
复制
std::string(s.begin(), s.find(" "))

有人知道为什么吗?我用的是g++ 4.8.1 under Ubuntu amd64

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

在本例中,我试图构建一个包含第一个子字符串的字符串,该字符串的末尾是第一个空格。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-26 09:17:37

std::string::find()返回一个偏移量,而不是迭代器(是的,这在很大程度上是标准库的设计不一致)。因此,要使用此方法(并包括正确的错误检查),请执行以下操作:

代码语言:javascript
复制
size_t offset = s.find(" ");
std::string(s.begin(), (offset == std::string::npos ? s.end() : s.begin() + offset);
票数 2
EN

Stack Overflow用户

发布于 2013-11-26 09:17:59

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-26 09:36:12

也许您在考虑std::find()算法,它会返回迭代器吗?

代码语言:javascript
复制
#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;
}

看到它在运行

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20212735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档