作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个来自标记化函数 tokenize()
的值 vector 。我知道它只有两个值。我想将第一个值存储在 a
中,将第二个值存储在 b
中。在 Python 中,我会这样做:
a, b = string.split(' ')
我可以用丑陋的方式这样做:
vector<string> tokens = tokenize(string);
string a = tokens[0];
string b = tokens[1];
但这需要额外的两行代码,一个额外的变量,并且可读性较差。
我如何在 C++ 中以干净高效的方式做这样的事情?
编辑:我必须强调效率非常重要。太多的答案不能满足这一点。这包括修改 my tokenization function .
编辑 2:出于我无法控制的原因,我正在使用 C++11,而且我也无法使用 Boost。
最佳答案
使用结构化绑定(bind)(肯定会在 C++17 中),您可以编写如下内容:
auto [a,b] = as_tuple<2>(tokenize(str));
哪里as_tuple<N>
是一些转换 vector<string>
的待声明函数到 tuple<string, string, ... N times ...>
,如果大小不匹配,可能会抛出。你不能解构 std::vector
因为它的大小在编译时是未知的。这必然会对 string
进行额外的移动所以你为了获得一些代码清晰度而失去了一些效率。也许没关系。
或者你可以写一个 tokenize<N>
返回 tuple<string, string, ... N times ...>
直接,避免额外的举动。在那种情况下:
auto [a, b] = tokenize<2>(str);
很棒。
在C++17之前,你所拥有的就是你能做的。但是只要让你的变量引用:
std::vector<std::string> tokens = tokenize(str);
std::string& a = tokens[0];
std::string& b = tokens[1];
是的,这是几行额外的代码。那不是世界末日。这很容易理解。
关于c++ - 将 vector 拆分为值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38249606/
我是一名优秀的程序员,十分优秀!