嘿,我正在寻找将用户输入的int转换为4个字节,我将其分配给字符数组.如何才能做到这一点?
例:
将用户输入175转换为
00000000 00000000 00000000 10101111
到目前为止所有答案的问题,转换255应该导致0 0 0 ff尽管它打印出来:0 0 0 ffffffff
unsigned int value = 255;
buffer[0] = (value >> 24) & 0xFF;
buffer[1] = (value >> 16) & 0xFF;
buffer[2] = (value >> 8) & 0xFF;
buffer[3] = value & 0xFF;
union {
unsigned int integer;
unsigned char byte[4];
} temp32bitint;
temp32bitint.integer = value;
buffer[8] = temp32bitint.byte[3];
buffer[9] = temp32bitint.byte[2];
buffer[10] = temp32bitint.byte[1];
buffer[11] = temp32bitint.byte[0];
Run Code Online (Sandbox Code Playgroud)
两者都导致0 0 0 ffffffff而不是0 …
正如Boost中的情况一样,C++ 11提供了一些用于转换的函数shared_ptr:
std::static_pointer_cast
std::dynamic_pointer_cast
std::const_pointer_cast
Run Code Online (Sandbox Code Playgroud)
但是,我想知道为什么没有等效功能unique_ptr.
考虑以下简单示例:
class A { virtual ~A(); ... }
class B : public A { ... }
unique_ptr<A> pA(new B(...));
unique_ptr<A> qA = std::move(pA); // This is legal since there is no casting
unique_ptr<B> pB = std::move(pA); // This is not legal
// I would like to do something like:
// (Of course, it is not valid, but that would be the idea)
unique_ptr<B> pB = std::move(std::dynamic_pointer_cast<B>(pA));
Run Code Online (Sandbox Code Playgroud)
是否有任何理由不鼓励这种使用模式,因此,shared_ptr没有提供与现有模式相同的功能unique_ptr …
当我xargs有时使用时,我不需要显式使用替换字符串:
find . -name "*.txt" | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)
在其他情况下,我想指定替换字符串,以便执行以下操作:
find . -name "*.txt" | xargs -I '{}' mv '{}' /foo/'{}'.bar
Run Code Online (Sandbox Code Playgroud)
上一个命令会将当前目录下的所有文本文件移入/foo,并将扩展名附加bar到所有文件.
如果不是将一些文本附加到替换字符串,我想修改该字符串,以便我可以在文件的名称和扩展名之间插入一些文本,我该怎么做?例如,假设我想要像上一个示例中那样做,但是文件应该重命名/移动<name>.txt到/foo/<name>.bar.txt(而不是/foo/<name>.txt.bar).
更新:我设法找到一个解决方案:
find . -name "*.txt" | xargs -I{} \
sh -c 'base=$(basename $1) ; name=${base%.*} ; ext=${base##*.} ; \
mv "$1" "foo/${name}.bar.${ext}"' -- {}
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更短/更好的解决方案.
可能重复:
在C++ 11范围内查找元素的位置for循环?
我有一个vector,我想迭代它,同时,可以访问每个单独元素的索引(我需要将元素及其索引传递给函数).我考虑过以下两种解决方案:
std::vector<int> v = { 10, 20, 30 };
// Solution 1
for (std::vector<int>::size_type idx = 0; idx < v.size(); ++idx)
foo(v[idx], idx);
// Solution 2
for (auto it = v.begin(); it != v.end(); ++it)
foo(*it, it - v.begin());
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更紧凑的解决方案.与Python的枚举类似的东西.这是我使用C++ 11范围循环时最接近的,但是必须在私有范围内定义循环外的索引,这似乎比1或2更糟糕的解决方案:
{
int idx = 0;
for (auto& elem : v)
foo(elem, idx++);
}
Run Code Online (Sandbox Code Playgroud)
是否有任何方法(可能使用Boost)以这样的方式简化最新的示例,使索引自包含到循环中?
我想知道在数组中搜索键并返回其值的最佳方法是什么.类似于array_search但是用于键.循环是最好的方法吗?
阵:
Array([20120425] => 409 [20120426] => 610 [20120427] => 277
[20120428] => 114 [20120429] => 32 [20120430] => 304
[20120501] => 828 [20120502] => 803 [20120503] => 276 [20120504] => 162)
Run Code Online (Sandbox Code Playgroud)
我正在寻找的价值:20120504
我试图获取匹配全路径模式的文件列表.到目前为止,我已经使用了list.files()但它没有用.
我们假设我们有以下目录组织:
results
|- A
| |- data-1.csv
| |- data-2.csv
|
|- B
|- data-1.csv
|- data-2.csv
Run Code Online (Sandbox Code Playgroud)
然后是以下命令:
list.files(pattern='data-.*\\.csv', recursive=TRUE)
Run Code Online (Sandbox Code Playgroud)
将返回与模式匹配的所有文件.这有效,但使用完整路径模式时会出现问题.例如,如果我想从目录结果/ A中获取所有CSV文件,我可以这样做:
list.files(pattern='results/A/data-.*\\.csv', recursive=TRUE)
Run Code Online (Sandbox Code Playgroud)
但这不起作用.不知何故,似乎R无法使用全路径模式作为正则表达式.在这种情况下,解决方案可能只是使用结果/ A作为基本路径.但在更复杂的问题中,这是不可能完成的.例如,在某些时候,我们可能希望匹配仅包含字符的子目录:
list.files(pattern='results/[A-Z]+/data-.*\\.csv', recursive=TRUE)
Run Code Online (Sandbox Code Playgroud)
可以在R中这样做吗?
更新:在使用临时解决方案一段时间后,我决定一次又一次地停止输入相同的内容.因此,我创建了一个用于简化此任务的库.
使用嵌套命名空间时,有时完全限定名称最终会很长.我知道我可以用它namespace abc = aaa::bbb::ccc来减少打字量(在某些情况下它也可以提高可读性).
但是,我不确定在项目中的所有文件中实现此重命名的最佳方法是什么.直接的方法(即,在每次使用的基础上重命名长命名空间)可能导致最终在不同文件中为相同的完全限定名称使用不同的短名称.所以,我正在考虑采用更一致的方式来做到这一点.
例如,让我们假设:
project
|- client
| |- core
| |- plugin
| |- util
|- server
...
Run Code Online (Sandbox Code Playgroud)
我想为每个目录创建一个包含简化名称的标题.例如,project/client/core/core.h将包含namespace pr_cl_core = project::client::core(我知道这个短名称的例子相当差,但在实际项目中他们更有意义).然后,我将包含core.h在所有头文件中,project/client/core以便当包含该目录中的头时,比方说,project/client/plugin/plugin_foo.h短命名空间版本随时可用.
这是一个很好的方法吗?还有其他更好的方法吗?
我在SO上找到了几个关于C++命名空间的问题(例如,1和2),但它们都没有涉及如何以项目范围的方式解决命名空间重命名问题.
编辑:此外,这种机制可用于系统地重命名整个项目的长名称空间(如Boost的名称空间).例如,我通常重命名一些名称空间,如:
namespace ip = boost::asio::ip;
namespace ptime = boost::posix_time;
Run Code Online (Sandbox Code Playgroud)
目前我是按翻译单位进行的,但我希望使用全局方法来完成整个项目.
我使用的vector::emplace_back是为了避免在填充矢量时构造时间对象.这里有一个简化版本:
class Foo {
public:
Foo(int i, double d) : i_(i), d_(d) {}
/* ... */
};
std::vector<Foo> v;
v.reserve(10);
for (int i = 0; i < 10; i++)
v.emplace_back(1, 1.0);
Run Code Online (Sandbox Code Playgroud)
但我想std::fill_n改用:
v.reserve(10);
std::fill_n(std::back_inserter(v), 10, Foo(1, 1.0));
Run Code Online (Sandbox Code Playgroud)
通过这种方式,将创建临时副本.我不知道emplace在这种情况下如何使用.我想我需要类似的东西std::back_emplacer,但我找不到这样的东西.这是C++ 11的一部分,但还没有在GCC中实现?如果它不是C++ 11的一部分,还有其他方法吗?
我有一个Java应用程序,其中创建了一些线程(via new Thread()).使用ps我可以看到他们有不同的线程ID(LWP列),我想从Java应用程序中获取这些ID.
在我找到的与此主题相关的大多数帖子中(例如,这个),解决方案是使用ManagementFactory.getRuntimeMXBean().getName().
但是,使用该方法可以获得主线程的PID(即使我从其中一个线程调用它),因此它并没有真正解决我的问题.
有没有办法获取Thread应用程序创建的每个单独的线程ID ?
是否可以使用JNI来完成它?如果我可以以某种方式连接到我可以调用的C函数syscall(__NR_gettid),那可以解决我的问题.我真的不关心可移植性,所以我完全可以使用只适用于Linux机器的解决方案.
更新:我实际上已经通过使用JNI解决了我的问题.细节在我的回答中解释.谢谢大家的建议/意见.
在我的任务:)尽可能多地使用STL我想知道是否可以使用std :: generate和std :: back_inserter组合,以便我可以执行与以下代码相同的操作:
static const size_t nitems=1024*1024;
std::string mrbig;
for (size_t pos=0; pos<nitems; ++pos)
mrbig.push_back('a'+ (rand()%26));
Run Code Online (Sandbox Code Playgroud)
我试过了
std::generate_n(std::back_inserter(mrbig),nitems,[](){return 'a'+(rand()%26);});
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常,但我想确保我没有弄乱一些东西.