我一直在研究C++ 11的一些新功能,我注意到的是在声明变量时使用的双符号,例如T&& var.
首先,这只野兽叫什么?我希望谷歌允许我们搜索这样的标点符号.
究竟是什么意思?
乍一看,它似乎是一个双重参考(如C风格的双指针T** var),但我很难想到一个用例.
我正在使用多线程并想要合并结果.例如:
std::vector<int> A;
std::vector<int> B;
std::vector<int> AB;
Run Code Online (Sandbox Code Playgroud)
我希望AB按顺序拥有A的内容和B的内容.做这样的事情最有效的方法是什么?
可能重复:
使用forward的优点
我知道它的作用以及何时使用它但我仍然无法理解其工作原理.请尽可能详细,并解释std::forward如果允许使用模板参数推断,何时不正确.
我的一部分困惑是:"如果它有一个名字,它就是一个左值" - 如果是这样的话,为什么std::forward当我通过thing&& xvs 时表现不同thing& x?
使用新的基于范围的for循环,我们可以编写类似的代码
for(auto x: Y) {}
Run Code Online (Sandbox Code Playgroud)
哪个IMO是一个巨大的进步(例如)
for(std::vector<int>::iterator x=Y.begin(); x!=Y.end(); ++x) {}
Run Code Online (Sandbox Code Playgroud)
可以用它来循环两个同时循环,比如Pythons zip函数吗?对于那些不熟悉Python的人,代码如下:
Y1 = [1,2,3]
Y2 = [4,5,6,7]
for x1,x2 in zip(Y1,Y2):
print x1,x2
Run Code Online (Sandbox Code Playgroud)
作为输出 (1,4) (2,5) (3,6)
我想用BOOST FOREACH复制以下内容
std::vector<int>::const_iterator i1;
std::vector<int>::const_iterator i2;
for( i1 = v1.begin(), i2 = v2.begin();
i1 < v1.end() && i2 < v2.end();
++i1, ++i2 )
{
doSomething( *i1, *i2 );
}
Run Code Online (Sandbox Code Playgroud) 我有一个向量v1,和一个v2相同大小的布尔向量.我想从v1所有值中删除,以便并行元素v2是false:
vector<int> v3; // assume v1 is vector<int>
for (size_t i=0; i<v1.size(); i++)
if (v2[i])
v3.push_back(v1[i]);
v1=v3;
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?
假设我有2个(或更多)容器我想同时迭代 - 例如,计算两个向量的点积:
std::vector<double> vector1;
std::vector<double> vector2; // identical size to vector1
Run Code Online (Sandbox Code Playgroud)
同时在两个(或所有)容器上指定range-for循环的首选C++ 11方法是什么?是否涉及选择一个容器/迭代器来for ( auto i : c )在范围for for循环中编写short-hand(ie ),而所有其他容器/迭代器必须长期处理?是否有任何理由将来的语法无法扩展到支持两个/所有容器的短手,如下所示...这看起来真的可读:
double dotProduct( 0.0 );
for ( auto const & value1 : vector1, auto const & value2 : vector2 ) // illegal!
{
dotProduct += value1*value2;
}
Run Code Online (Sandbox Code Playgroud) 有没有一种方法可以boost::combine使用结构化绑定和基于范围的 for(这样结构绑定中的标识符实际上指向容器的元素,而不是内部使用的嵌套元组boost::combine)?以下(实时示例)无法编译:
#include <boost/range/combine.hpp>
#include <iostream>
int main()
{
std::vector<int> a{1,2,3};
std::vector<int> b{2,3,4};
for (auto [f, s] : boost::combine(a, b))
{
std::cout << f << ' ' << s << std::endl
}
}
Run Code Online (Sandbox Code Playgroud) 我需要一个针对以下情况的建议 - 我几个小时都无法弄明白:如何通过多个seq.容器大小相同(这里:两个向量)的简单方法?
int main() {
int size = 3;
std::vector<int> v1{ 1, 2, 3 }, v2{ 6, 4, 2 };
// old-fashioned - ok
for (int i = 0; i < size; i++) {
std::cout << v1[i] << " " << v2[i] << std::endl;
}
// would like to do the same as above with auto range-for loop
// something like this - which would be fine for ONE vector.
// But this does not work. Do I need …Run Code Online (Sandbox Code Playgroud) 我对新的现代C++标准感兴趣.因为我已经用适用的新的基于范围的for循环替换了所有旧的for循环.
然而,我最近遇到了一些似乎不起作用的东西.虽然我认为这将是对已经完成的工作的简单扩展.我只是想知道我是否遗漏了什么?
我的问题:我有2个大小相同的信息向量,它们存储来自我们的一个3d派对组件的HTTP头.我需要循环这两个以将标头添加到我的http客户端.
目前我的代码类似于以下内容:
auto iter1 = vec1.begin();
auto iter2 = vec2.begin();
while (iter1 != vec1.end())
{
http_client.add_header(*iter1, *iter2);
++iter1;
++iter2;
}
Run Code Online (Sandbox Code Playgroud)
我可能会有什么:
for (auto header, value : vec1, vec2)
{
http_client.add_header(header, value);
}
Run Code Online (Sandbox Code Playgroud)
我原以为这会明确地声明我的两个向量必须是相同的长度,因此检查可以自动完成.而且这可以以最有效的方式实现(毕竟我确信我当前的代码中有许多隐藏的漏洞).不仅如此,我认为多范围的循环声明更容易理解.
有没有这样的东西可用或者我完全忽略了这一点?
我想知道在c ++ 11语法中是否有可能为多个项使用基于for for循环的新容器,例如:
std::vector<double> x;
std::vector<double> y;
for (double& xp, yp : x, y)
{
std::cout << xp << yp << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我无法找到有关将此循环用于多个容器的任何信息.我将非常感谢所有的帮助.
经典for循环中的示例效果:
std::vector<double>::iterator itX = m_x.begin();
std::vector<double>::iterator itY = m_y.begin();
for (uint32_t i = 0; i < m_x.size(); i++, itX++, itY++)
{
// operations on the m_x and m_y vectors
}
Run Code Online (Sandbox Code Playgroud) 有没有办法迭代两个容器(一个跟随另一个),而不使用两个for循环.
我的意图是做这样的事情
vector<int> a{ 1,2,3 };
vector<int> b{ 4,5,6 };
auto it = a.begin();
auto end = b.end();
for (; it != end; ++it)
{
if (it == a.end())
{
it = b.begin();
}
// do something with *it
}
Run Code Online (Sandbox Code Playgroud)
打印
1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)
(当然它不起作用.解释在这个答案中)
我不想写两个for循环并复制循环内的代码.有没有办法迭代a后跟b一个for循环?
我能想到的唯一的事情或者是拷贝/第二容器移动到第一或合并创建一个新的矢量a和b,然后遍历它.我也不想这样做,因为这意味着昂贵的复制操作.
我正在尝试将两个std::map容器(例如std::map<int, int> foo, bar)合并到第三个容器std::map(例如std::map<int, int> foobar)中。
我知道我可以使用迭代器来实现这一点,如下所示:
std::map<int, int>::iterator itr1 = foo.begin();
std::map<int, int>::iterator itr2 = bar.begin();
for (; itr1 != foo.end() && itr2 != bar.end(); ++itr1, ++itr2)
{
foobar[itr1->first] += itr1->second;
foobar[itr2->first] += itr2->second;
}
Run Code Online (Sandbox Code Playgroud)
但是我如何使用基于范围的 for 循环(也许与结构化绑定声明结合使用)来实现相同的目的?
或者有没有更好的方法来组合这两个关联容器?
编辑:这个问题的预期答案应该采用两个容器(std::map此处)并将它们组合成一个联合/联合映射,其中键来自各自的关联容器,并且添加重复键的值。
示例:
如果给定std::map容器foo和bar是:
std::map<int, int> foo = {{1, 10}, {2, 20}, {3, 30}};
std::map<int, int> bar = {{3, 50}, {4, 60}};
Run Code Online (Sandbox Code Playgroud)
那么“foobar”应该是:
std::map<int, int> …Run Code Online (Sandbox Code Playgroud)