如何std::count根据最里面向量的第二个值来计算向量向量?
我将向量声明为:
vector< vector<int> > distance(data.size(),vector<int>(3));
Run Code Online (Sandbox Code Playgroud) 我有以下示例代码。是否可以在不指定对象向量中的“测试”的情况下初始化对象列表,或者这是最好的方法?谢谢。
class Test {
public:
Test(const std::initializer_list<int> list) : m_(list) {
}
private:
std::vector<int> m_;
};
int main(int argc, char **argv) {
std::vector<Test> v = { Test({1, 2, 3}), Test({1, 2, 4}) };
}
Run Code Online (Sandbox Code Playgroud) 如何在 C++ 中将 std::vector强制转换或转换为 char**?
我使用 std::vector 是因为我需要在循环内推送一些字符串,但随后我必须调用需要 char** 的 C 函数。
使用向量向量,我可以这样做:
std::vector<std::vector<int>> vov;
vov.emplace_back(std::initializer_list<int>{0, 0});
Run Code Online (Sandbox Code Playgroud)
但是, std::array 的向量等效失败:
std::vector<std::array<int, 2>> voa;
voa.emplace_back(std::initializer_list<int>{0,0});
Run Code Online (Sandbox Code Playgroud)
在向量中放置数组的正确方法是什么?
编辑:
是的,您可以从初始化列表创建 std::array :
std::array<int, 2> a = {0, 0}
Run Code Online (Sandbox Code Playgroud)
工作正常。
错误:
error C2664: 'std::array<int,2>::array(const std::array<int,2> &)': cannot convert argument 1 from 'std::initializer_list<int>' to 'const std::array<int,2> &'
Run Code Online (Sandbox Code Playgroud) 我需要比较两个浮点数组的值是否相等。我知道它们的长度相同。但不幸的是,数组的类型不同:
bool compare(vector<float> A, float* B)
{
// what do I write here?
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做?我对指针不太熟悉。
为什么我可以在 for 循环的每次迭代中在 for 循环 [for (auto val: k0L){...}] 中声明和定义 3 个变量?当我执行 g++ code.cpp 时,编译器不会抱怨。我知道一个变量只能声明一次。我知道我不能写 int a = 5; int a = 6; 在 main() 范围内。但是,这就是我在 for 循环中所做的。谢谢!
#include <iostream>
#include <vector>
#include <fstream>
#include <math.h>
#include <algorithm>
#define PI 3.14159265
std::vector<double> linspace (double start, double end, size_t points) { // will be used in main(), details of this function are not important.
std::vector<double> res(points);
double step = (end - start) / (points - 1);
size_t i = 0;
for …Run Code Online (Sandbox Code Playgroud) 我的任务是创建一个与以下相同的函数
template <typename It>
auto MakeSet(It range_begin, It range_end) {
return set(range_begin, range_end);
}
Run Code Online (Sandbox Code Playgroud)
但它必须是一个模板,它接收迭代器(begin() 和 end())并返回一个包含范围内元素的向量。
我试过
template<typename Type, typename It>
auto MakeVector(It range_begin, It range_end) {
return vector<Type> v(range_begin, range_end);
}
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误
无法识别的模板声明/定义
我问这个是因为关于 SO 的其他相关问题似乎是针对旧版本的 C++ 标准,没有提到任何形式的并行化,或者专注于在删除元素时保持排序/索引相同。
我有一个可能包含数十万或数百万个元素的向量(它们是相当轻的结构,假设它们被压缩了大约 20 个字节)。
由于其他限制,它必须是 astd::vector并且其他容器不起作用(例如std::forward_list),或者在其他用途中甚至不太理想。
我最近从简单的it = std::erase(it)方法切换到使用 pop-and-swap 使用这样的东西:
for(int i = 0; i < myVec.size();) {
// Do calculations to determine if element must be removed
// ...
// Remove if needed
if(elementMustBeRemoved) {
myVec[i] = myVec.back();
myVec.pop_back();
} else {
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,并且是一个显着的改进。它将方法的运行时间减少到以前的 61%。但我想进一步改进这一点。
C++ 是否有一种方法可以std::vector有效地从 a 中删除许多非连续元素?就像将索引向量传递给erase()C++ 并让 C++ 在幕后做一些魔术以最大程度地减少数据移动?
如果是这样,我可以让线程单独收集必须并行删除的索引,然后组合它们并将它们传递给擦除()。
在 C++ 标准vector.capacity部分,它为 定义了两个重载resize()。(另见https://en.cppreference.com/w/cpp/container/vector/resize)
此重载要求类型 T 是MoveInsertableand DefaultInsertable:
constexpr void resize(size_type sz);
Run Code Online (Sandbox Code Playgroud)
另一个重载要求类型 T 是CopyInsertable:
constexpr void resize(size_type sz, const T& c);
Run Code Online (Sandbox Code Playgroud)
标准中提到的部分的第 16 条规定了第一次重载:
如果非 Cpp17CopyInsertable T的移动构造函数引发异常,则不会产生任何影响。
但是对于第二次重载,它指出:
如果抛出异常,则没有任何影响。
第二个重载中没有提到移动构造函数的抛出。为什么?
什么是安全、便携、惯用的方式来使用std::vector.
std::vector<Foo> foos;
foos.emplace_back(1);
foos.emplace_back(2);
foos.reserve(10);
Run Code Online (Sandbox Code Playgroud)
此时foos,至少拥有8 * sizeof(Foo)从 开始的未初始化的备用内存foos.data() + foos.size()。让这些内存浪费掉似乎非常低效。在Foo通过附加到用对象填充它之前,如何将此空闲容量用作暂存空间或用于其他目的foos?在不调用任何未定义行为的情况下执行此操作的正确方法是什么?